参考此处引用的示例 https://www.elastic.co/guide/en/elasticsearch/guide/current/ngrams-compound-words.html
寻找“Adler”会返回结果。 搜索“Adler”将成为对adl,dle和ler三个术语的查询:
但是为什么查询“Zdler”会返回结果,即使zdl不是其中一个条款?
<task active="true" id="LOCAL-00674" summary="Some Task">
<created>1501071813825</created>
<option name="number" value="00674" />
<option name="presentableId" value="LOCAL-00674" />
<option name="project" value="LOCAL" />
<updated>1501071815536</updated>
<workItem from="1501071815699" duration="59000" />
</task>
对“Adler”上的搜索应用匹配查询会返回记录 - 预期。
但是,“Zdler”上的匹配查询也会返回记录(因为dle和ler匹配)。即使设置“minimum_should_match”:“100%”也会返回记录 - 不是预期的
对“Adler”的搜索应用术语查询不会返回任何内容 - 不是预期的
GET /my_index/my_type/_search
{
"query": {
"match": {
"text": {
"query": "zdler"
}
}
}
}
如何仅在搜索“Adler”而不是“Zdler”时返回记录?
POST /my_index/my_type/_search
{
"query": {
"term": {
"text": {
"value": "Adler"
}
}
}
}
这些是映射
"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"
}
}
}
答案 0 :(得分:1)
match query在输入查询上应用字段分析器。这类似地产生用于输入的标记(&#34; zdler&#34;),然后再次匹配倒排索引。但是对于术语查询不会是这种情况,因为它不会在输入值上应用字段分析器
匹配查询中断&#34; adler&#34;进入 - &gt; &#34; a&#34;,&#34; d&#34;,&#34; l&#34;,&#34; e&#34; .....然后根据倒排索引进行匹配。
尝试理解以下两个查询
POST index5/_search
{
"query": {
"match": {
"text": "zdler"
}
}
}
POST index5/_search
{
"query": {
"term": {
"text": {
"value": "zdler"
}
}
}
}
答案 1 :(得分:0)
解决方案是应用标准分析器进行搜索。 下面的查询返回一条记录,搜索“zdler”将不会返回任何结果。
GET /my_index_2/my_type/_search
{
"query": {
"match": {
"text": {
"query": "adler",
"analyzer": "standard"
}
}
}
}