当前位置: 首页 > 知识库问答 >
问题:

具有前缀查询的弹性搜索用例不敏感查询

夏锐藻
2023-03-14

我不熟悉弹性搜索。我有以下疑问

GET deals2/_search 
{
  "size": 200,
  "_source": ["acquireInfo"],
   "query": {
    "bool": {

      "must": [
        {

         "query_string": {
           "fields": ["acquireInfo.company_name.keyword"],
           "query": "az*"
         }
        }
      ]
    }
  }

}

这里我想要Elastic应该给出类似大小写不敏感的结果

"Az" 
"AZ" 
"az"
"aZ"
"Az"

但是我不会像这样得到所有的结果。所以任何人都可以帮我。

我有4份文件

1)Aziia Avto Ust-Kamenogorsk OOO 
2)AZ Infotech Inc 
3)AZURE Midstream Partners LP 
4)State Oil Fund of the Republic of Azerbaijan

现在在az上搜索时,应该只返回前3个文档,因为它们以az开头,忽略这里的大小写,而不是第4个,它也有az,但不在开头。

共有1个答案

贺高飞
2023-03-14

当您使用关键字字段为应用程序中的公司名称编制索引时,就会出现这种情况。

关键字分析器是一个“noop”分析器,它以单个标记的形式返回整个输入字符串,例如,公司名称,由foo组成,foofoo将仅以大小写存储,并搜索foo,将只匹配foo,因为弹性搜索最终会对令牌匹配起作用(区分大小写)。

你需要的是使用一个标准分析器或其他一些自定义分析器来解决你的其他用例,并在字段上使用小写标记过滤器,使用分析的匹配查询,并使用用于索引字段的相同分析器,这样你的搜索查询将生成相同的标记,它存储在索引中,您的搜索将不区分大小写。

编辑:在聊天中与用户进行讨论,并更新答案以满足其要求,如下所示:-

第一步:-定义索引的设置和映射。

endpoint:-超文本传输协议://{{主机名}}:{{端口}}/{{索引}}

{
  "settings": {
    "analysis": {
      "normalizer": {
        "my_normalizer": {
          "type": "custom",
          "char_filter": [],
          "filter": "lowercase"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "company_name": {
        "type": "keyword",
        "normalizer": "my_normalizer"
      }
    }
  }
}

第2步:为所有文档编制索引

endpoint:超文本传输协议://{{主机名}}:{{端口}}/{{索引}}/_doc/--

{
    "company_name" : "State Oil Fund of the Republic of Azerbaijan"
}

第三步:搜索查询

endpoint:-超文本传输协议://{{主机名}}:{{端口}}/{{索引}}/_search

{ "query": {
    "prefix" : { "company_name" : "az" }
  }
}

这将带来以下预期结果:-

{
    "took": 870,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1,
        "hits": [
            {
                "_index": "prerfixsearch",
                "_type": "_doc",
                "_id": "2ec9df0fc-dc04-47bb-914f-91a9f20d09efd15f2506-293f-4fb2-bdc3-925684a930b5",
                "_score": 1,
                "_source": {
                    "company_name": "AZ Infotech Inc"
                }
            },
            {
                "_index": "prerfixsearch",
                "_type": "_doc",
                "_id": "160d01183-a308-4408-8ac1-a85da950f285edefaca2-0b68-41c6-ba34-21bbef57f84f",
                "_score": 1,
                "_source": {
                    "company_name": "Aziia Avto Ust-Kamenogorsk OOO"
                }
            },
            {
                "_index": "prerfixsearch",
                "_type": "_doc",
                "_id": "1da878175-7db5-4332-baa7-ac47bd39b646f81c1770-7ae1-4536-baed-0a4f6b20fa38",
                "_score": 1,
                "_source": {
                    "company_name": "AZURE Midstream Partners LP"
                }
            }
        ]
    }
}

说明:正如之前的OP没有提到在搜索结果中排除第4个文档,这就是我建议创建一个文本字段的原因,这样就可以生成个人令牌,但现在由于要求只是前缀搜索,我们不需要个人令牌,我们只需要1个令牌,但它应该被低删除以支持不区分大小写的搜索,这就是我在company_name字段上应用自定义规范化器的原因。

 类似资料:
  • 我有以下格式的弹性搜索文档 } } 我的要求是,当我搜索特定字符串(string.string)时,我只想获得该字符串的FileOffSet(string.FileOffSet)。我该怎么做? 谢谢

  • 问题内容: 有什么方法可以使搜索查询的重音不敏感吗? 列和表的排序规则是utf8_polish_ci,我不想更改它们。 例句:toruń 它找不到“toruń”。我怎样才能做到这一点? 问题答案: 您可以在运行时在sql查询中更改排序规则, 但是请注意,在运行时即时更改排序规则会放弃mysql使用索引的可能性,因此大型表的性能可能很糟糕。 或者,您可以将列复制到另一列,例如,但是更改其排序规则。这

  • 我正在LDAP服务器上工作。它有弹性搜索。我必须用一些Javascript代码(JSON格式)发送查询。 这是我的查询: 我试图打印所有结果,其中“server”=“server\u name”(该字段是server:server\u name…)。我认为关于弹性搜索的文档太小了。我找到了一些文档,但都是一样的,对新用户没有帮助。这个例子太简单了。 此查询返回所有结果,包括任何筛选器。 Ps:这就

  • 我刚加入弹性搜索公司。而不知道如何在JSON请求中对索引和an类型发出正确的请求?(所以我不想像localhost:9200/myindex/mytype/_search那样在URL中使用索引和类型,而是向localhost:9200/_search发出JSON请求) 我试过这样的东西。但我得到的结果是'AAA'索引而不是'BBB'索引。如何只从bbb索引得到结果或者根本没有结果?

  • 我在术语查询中要求弹性搜索中的嵌套字段,其中嵌套字段值应与术语查询中提供的值的数量完全匹配。例如,考虑下面的查询,在这里我们对名为类型的嵌套字段进行查询。 GET资产/_search 索引映射 样本文件: 上述查询应返回字段类型正好有2个值的文档,即“VOD”

  • 如何获得空数组和美国的结果和