elasticsearch ElasticSearch查询不区分大小写
我正在尝试搜索查询,它可以很好地进行精确搜索,但若用户输入小写或大写,它就不能工作,因为ElasticSearch不区分大小写 范例elasticsearch ElasticSearch查询不区分大小写,elasticsearch,nest,elasticsearch,Nest,我正在尝试搜索查询,它可以很好地进行精确搜索,但若用户输入小写或大写,它就不能工作,因为ElasticSearch不区分大小写 范例 { "query" : { "bool" : { "should" : { "match_all" : {} }, "filter" : { "term" : {
{
"query" : {
"bool" : {
"should" : {
"match_all" : {}
},
"filter" : {
"term" : {
"city" : "pune"
}
}
}
}
}
当city正好是“pune”时,它可以正常工作,如果我们将文本更改为“pune”,它将不工作。除非您定义自定义映射,否则Elasticsearch将以小写形式分析文本字段 精确值(如数字、日期和关键字)具有精确值 在添加到反向索引的字段中指定,以便 它们是可搜索的 但是,将分析文本字段。这意味着他们的价值观是 首先通过分析器生成术语列表,这些术语是 然后添加到反向索引中。有很多方法可以分析文本: 默认的标准分析器会删除大多数标点符号,分解文本 将其转换为单个单词,并将其小写 见: 因此,如果您想使用术语查询 — 在查询之前,请自行完成。或者在这种情况下,将术语小写 ElasticSearch不区分大小写 “Elasticsearch”不区分大小写。默认情况下,JSON字符串属性将映射为(带有一个子或,我将很快解释)
text
数据类型具有与之相关联的分析概念;在索引时,输入的字符串被输入,结果项存储在一个反向索引数据结构中,用于快速全文搜索。对于未指定分析器的文本
数据类型,将使用默认分析器,即。标准分析器的一个组件是,它将标记(术语)小写
当涉及到通过搜索API查询Elasticsearch时,有许多不同类型的查询可供使用,以适应几乎任何用例。一系列查询,如match
,multi\u match
查询,都是全文查询。这些类型的查询在搜索时对查询输入执行分析,并将结果项与存储在倒排索引中的项进行比较。默认情况下使用的分析仪也将是标准分析仪
另一类查询,如术语
,术语
,前缀
查询,是术语级查询。这些类型的查询不会分析查询输入,因此查询输入将与倒排索引中存储的术语进行比较
在您的示例中,您对
“city”
字段的术语
查询在大写时未找到任何匹配项,因为它正在搜索其输入在索引时经过分析的文本
字段。对于默认映射,这是关键字
子字段可以提供帮助的地方。关键字
数据类型不进行分析(它的分析类型为),因此可以用于精确匹配以及排序和聚合。要使用它,您只需要针对“city.keyword”
字段。另一种方法是将“city”
字段使用的分析器更改为不使用小写标记过滤器的分析器;采用这种方法需要重新索引索引中的所有文档。为了解决这个问题,我创建了自定义规范化和更新映射以添加
在我们必须删除索引并再次添加它之前
首先删除索引
删除PUT
现在再次创建索引
放
那么,
city
字段的字段类型是什么?“city”:{“type”:“text”}您可能需要检查映射以查看是否分析了city
字段。使用match query
而不是term query
。谢谢,这样可以轻松配置。
{
"settings": {
"analysis": {
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
"char_filter": [],
"filter": ["lowercase", "asciifolding"]
}
}
}
},
"mappings": {
"user": {
"properties": {
"city": {
"type": "keyword",
"normalizer": "lowercase_normalizer"
}
}
}
}
}