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数据类型 sub或multi字段,我将在稍后解释)。
一个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
因此,如果您想使用术语查询?—?在查询之前自行分析该术语。或者在这种情况下只是小写该术语。
为了解决这个问题,我创建自定义标准化并更新映射以添加,
在我们必须删除索引并再次添加之前
首先删除索引
删除放置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)