ElasticSearch搜索查询不区分大小写

时间:2018-10-10 18:06:35

标签: elasticsearch nest

我正在尝试搜索查询,但是对于精确搜索来说它可以正常工作,但是如果用户输入小写或大写字母,它就无法工作,因为ElasticSearch不区分大小写。

示例

{
    "query" : {
        "bool" : { 
            "should" : {
                "match_all" : {} 
            },
            "filter" : {
                "term" : { 
                    "city" : "pune"
                }
            }
        }
    }
}

当城市正好是“浦那”时,它可以正常工作,如果我们将文本更改为“ PUNE”,则它不起作用。

3 个答案:

答案 0 :(得分:3)

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

  

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

     

但是,将分析文本字段。这意味着他们的价值观是   首先通过分析器生成一系列术语,这些术语是   然后添加到倒排索引。有多种分析文本的方法:   默认的标准分析器会删除大多数标点符号,分解文本   变成单个单词,并小写

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

因此,如果要在查询之前自行使用术语查询— analyze the term。或者在这种情况下,只需将术语小写。

答案 1 :(得分:2)

  

ElasticSearch不区分大小写。

“ Elasticsearch”不区分大小写。默认情况下,JSON字符串属性将被映射为text datatype(带有keyword datatype sub multi field,我将在稍后解释)。

text数据类型具有与之相关的分析概念;在索引时间,通过an analysis chain输入字符串输入,并将生成的 term 存储在反向索引数据结构中,以进行快速的全文本搜索。对于未指定分析器的text数据类型,将使用默认的分析器,即Standard Analyzer。标准分析器的组成部分之一是Lowercase token filter,它会小写标记(条款)。

在通过搜索API查询Elasticsearch时,有许多不同类型的查询可供使用,以适应几乎所有用例。诸如matchmulti_match查询之类的一类查询是全文查询。这些类型的查询会在搜索时对查询输入进行分析,并将结果项与存储在倒排索引中的项进行比较。默认使用的分析器也将是标准分析器。

另一类查询,例如termtermsprefix查询,是术语级查询。这些类型的查询不会分析查询输入,因此会将查询输入按原样与存储在反向索引中的术语进行比较。

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

答案 2 :(得分:0)

为解决此问题,我创建了自定义规范化并更新了映射以添加

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

首先删除索引

删除PUT http://localhost:9200/users

现在再次创建索引

输入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"
        }
      }
    }
  }
}