参考此处引用的示例,https://www.elastic.co/guide/en/elasticsearch/guide/current/ngrams-compound-words.html
搜索"Adler“会返回结果。搜索“Adler”就变成了查询adl、dle和ler这三个词:
但是,为什么对"Zdler“的查询返回结果,即使zdl不在其中?
GET /my_index/my_type/_search
{
"query": {
"match": {
"text": {
"query": "zdler"
}
}
}
}对搜索"Adler“应用匹配查询将返回记录--预期的。
但是,对"Zdler“的匹配查询也会返回记录(因为dle和ler匹配)。即使设置为"minimum_should_match":"100%“也会返回记录--这不是预期的
应用术语查询搜索"Adler“不返回任何结果--不是预期的结果
POST /my_index/my_type/_search
{
"query": {
"term": {
"text": {
"value": "Adler"
}
}
}
}如何实现只在"Adler“上搜索而不是在"Zdler”上返回记录?
"settings": {
"index": {
"number_of_shards": "5",
"provided_name": "my_index",
"creation_date": "1501069624443",
"analysis": {
"filter": {
"trigrams_filter": {
"type": "ngram",
"min_gram": "3",
"max_gram": "3"
}
},
"analyzer": {
"trigrams": {
"filter": [
"lowercase",
"trigrams_filter"
],
"type": "custom",
"tokenizer": "standard"
}
}
},
"number_of_replicas": "1",
"uuid": "Z5BXi_RjTACzTsR_-Nu9tw",
"version": {
"created": "5040099"
}
}
}这些是映射
{
"my_index": {
"mappings": {
"my_type": {
"properties": {
"text": {
"type": "text",
"analyzer": "trigrams"
}
}
}
}发布于 2017-07-26 20:59:45
match query在抛出查询之前对输入查询应用字段分析器。这类似地为输入("zdler")生成标记,然后再次匹配倒排索引。但是术语查询的情况就不一样了,因为它不会对输入值应用字段分析器
匹配查询将"adler“拆分为-> "a”、"d“、"l”、"e“.....然后将其与倒排索引进行匹配。
试着理解下面两个问题
POST index5/_search
{
"query": {
"match": {
"text": "zdler"
}
}
}
POST index5/_search
{
"query": {
"term": {
"text": {
"value": "zdler"
}
}
}
}发布于 2017-08-02 15:29:25
解决方案是应用标准分析器进行搜索。下面的查询返回一条记录,搜索"zdler“不会返回任何结果。
GET /my_index_2/my_type/_search
{
"query": {
"match": {
"text": {
"query": "adler",
"analyzer": "standard"
}
}
}
}https://stackoverflow.com/questions/45326580
复制相似问题