elasticsearch n-gram示例澄清

时间:2017-07-26 12:08:39

标签: elasticsearch n-gram

参考此处引用的示例 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"
    }
  }
}

2 个答案:

答案 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"
        }
    }
  }
}