我正在尝试搜索查询,但是对于精确搜索来说它可以正常工作,但是如果用户输入小写或大写字母,它就无法工作,因为ElasticSearch不区分大小写。
示例
{
"query" : {
"bool" : {
"should" : {
"match_all" : {}
},
"filter" : {
"term" : {
"city" : "pune"
}
}
}
}
}
当城市正好是“浦那”时,它可以正常工作,如果我们将文本更改为“ PUNE”,则它不起作用。
答案 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时,有许多不同类型的查询可供使用,以适应几乎所有用例。诸如match
,multi_match
查询之类的一类查询是全文查询。这些类型的查询会在搜索时对查询输入进行分析,并将结果项与存储在倒排索引中的项进行比较。默认使用的分析器也将是标准分析器。
另一类查询,例如term
,terms
,prefix
查询,是术语级查询。这些类型的查询不会分析查询输入,因此会将查询输入按原样与存储在反向索引中的术语进行比较。
在您的示例中,您在term
字段上的"city"
查询在大写时找不到任何匹配项,因为它是针对在索引时间对其输入进行了分析的text
字段进行搜索。使用默认映射,这就是keyword
sub 字段可以提供帮助的地方。 keyword
数据类型不进行分析(嗯,它具有使用normalizers进行的分析类型),因此可以用于精确匹配以及排序和聚合。要使用它,您只需要定位"city.keyword"
字段即可。另一种替代方法也可以是将"city"
字段使用的分析器更改为不使用小写标记过滤器的分析器。采用这种方法将需要您重新索引索引中的所有文档。
答案 2 :(得分:0)
为解决此问题,我创建了自定义规范化并更新了映射以添加
在我们必须删除索引然后再次添加索引之前
首先删除索引
删除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"
}
}
}
}
}