ElasticSearch 搜索查询不区分大小写

Roh*_*hit 9 elasticsearch nest

我正在尝试搜索查询,它对于精确搜索工作正常,但如果用户输入小写或大写,则它不起作用,因为 ElasticSearch 不区分大小写。

例子

{
    "query" : {
        "bool" : { 
            "should" : {
                "match_all" : {} 
            },
            "filter" : {
                "term" : { 
                    "city" : "pune"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当 city 正好是“pune”时它工作正常,如果我们将文本更改为“PUNE”它不起作用。

Rus*_*Cam 13

ElasticSearch 不区分大小写。

“Elasticsearch”不区分大小写。默认情况下,JSON 字符串属性将映射为text数据类型(使用keyword数据类型 submulti字段,我将在稍后解释)。

一个text数据类型都有与它相关分析的概念; 在索引时,字符串输入通过分析链输入,结果存储在倒排索引数据结构中,用于快速全文搜索。对于text未指定分析器的数据类型,将使用默认分析器,即标准分析器。标准分析器的组件之一是小写标记过滤器,它小写标记 ( terms )。

当涉及到通过搜索 API 查询 Elasticsearch 时,有很多不同类型的查询可供使用,以适应几乎任何用例。一类查询,例如match,multi_match查询,是全文查询。这些类型的查询在搜索时对查询输入执行分析,并将结果术语与存储在倒排索引中的术语进行比较。默认使用的分析器也将是标准分析器。

另一类查询(例如term, terms,prefix查询)是词级查询。这些类型的查询不分析查询输入,因此查询输入将与存储在倒排索引中的术语进行比较。

在您的示例中,您term对该"city"字段的查询在大写时找不到任何匹配项,因为它正在搜索text其输入在索引时进行分析的字段。使用默认映射,这是keyword 字段可以提供帮助的地方。甲keyword数据类型不经历分析(当然,它有一个与型分析的正规化),因此可用于精确匹配,以及排序和聚合。要使用它,您只需要定位该"city.keyword"字段。另一种方法是将"city"字段使用的分析器更改为不使用小写标记过滤器的分析器;采用这种方法需要您重新索引索引中的所有文档。


wp7*_*8de 11

除非您定义自定义映射,否则 Elasticsearch 将分析文本字段小写。

精确值(如数字、日期和关键字)具有添加到倒排索引的字段中指定的精确值,以便使它们可搜索。

但是,会分析文本字段。这意味着它们的值首先通过分析器以生成术语列表,然后将其添加到倒排索引中。分析文本的方法有很多种:默认的标准分析器会删除大部分标点符号,将文本分解为单个单词,然后将它们小写

请参阅:https : //www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html

因此,如果您想使用术语查询?—?在查询之前自行分析该术语。或者在这种情况下只是小写该术语。


Roh*_*hit 5

为了解决这个问题,我创建自定义标准化并更新映射以添加,

在我们必须删除索引并再次添加之前

首先删除索引

删除放置http://localhost:9200/users

现在再次创建索引

PUT http://localhost:9200/users

{
  "settings": {
    "analysis": {
      "normalizer": {
        "lowercase_normalizer": {
          "type": "custom",
          "char_filter": [],
          "filter": ["lowercase", "asciifolding"]
        }
      }
    }
  },
  "mappings": {
    "user": {
      "properties": {
        "city": {
          "type": "keyword",
          "normalizer": "lowercase_normalizer"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)