ElasticSearch:布尔/术语搜索不区分大小写

use*_*968 0 elasticsearch

以下 ElasticSearch 查询给出了预期结果:

{'query': {'bool': {'must': [{'bool': {'should': [{'term': {'name.keyword': 'Finding'}}]}}]}}, 'size': 10, 'from': 0}
Run Code Online (Sandbox Code Playgroud)

但这给出了空结果。

{'query': {'bool': {'must': [{'bool': {'should': [{'term': {'name.keyword': 'finding'}}]}}]}}, 'size': 10, 'from': 0}
Run Code Online (Sandbox Code Playgroud)

唯一不同的是“发现”改为“发现”。ElasticSearch 默认情况下“不区分大小写”,我有以下映射。我期望两个查询都会给我相同的结果。这是怎么回事?

  "name": {
    "type": "text",
    "analyzer": "keyword",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  
Run Code Online (Sandbox Code Playgroud)

ESC*_*der 5

术语查询返回字段中包含的确切文档。它不会分析正在搜索的术语。

  1. 在第一种情况下,您使用的是关键字分析器( name.keyword)。这将标记Finding化为Finding. 因此,当您使用术语查询来搜索 时Finding,这将返回包含确切术语的文档Finding

  2. 在第二种情况下,您正在查询name字段。如果未指定分析器,Elasticsearch 将使用标准分析器。所以,这里Finding被标记为finding

现在,如果您finding使用术语查询进行搜索,您将不会得到任何搜索结果。由于索引中没有包含以下内容的文档"name":"finding"


从 7.10 开始,elasticsearch 引入了一个新参数case_insensitive,它允许我们进行不区分大小写的搜索。

{
  "query": {
    "term": {
      "name.keyword": {
        "value": "finding",
        "case_insensitive": true
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的Elasticsearch版本低于7.10.0,那么您应该使用匹配查询进行全文搜索