如何在elasticsearch中使用3的edge-ngram匹配1-2个字符的完全匹配

时间:2015-11-12 16:45:52

标签: elasticsearch n-gram

我使用elasticsearch来查询具有模糊匹配的索引。我使用的是一个edge-ngram tokenizer,其min_gram长度为3。

但是,对于仅包含1或2个字符的查询,这不会返回任何内容。是否可以匹配那些1或2个字符的完全匹配,但是使用edge-ngram进行三个或更多字符的查询?

这是我目前的弹性搜索索引映射:

curl -XPUT 'http://localhost:9200/person' -d '{
"settings": {
    "number_of_shards": 1,
    "analysis": {
        "filter": {
            "autocomplete_filter": {
                "type":     "edge_ngram",
                "min_gram": 3,
                "max_gram": 20
            }
        },
        "analyzer": {
            "default": {
                "type":      "custom",
                "tokenizer": "standard",
                "filter": [
                    "lowercase",
                    "autocomplete_filter"
                ]
            }
        }
    }
}
}'

要查询此索引,请执行以下请求:

curl -XPOST 'localhost:9200/person/type/_search' -d '{
    "query": {
        "match": {
            "_all": "Tim”
        }
    }
}'

产生大量结果,但请求如

curl -XPOST 'localhost:9200/person/type/_search' -d '{
    "query": {
        "match": {
            "_all": "Ti”
        }
    }
}'

给出一个空集。理想情况下,如果名为Tim的索引中有人,则第二个请求将返回一些结果。

1 个答案:

答案 0 :(得分:2)

我不确定这是否满足您的所有要求。您可以检查用户输入的长度是否小于3,然后触发以下查询。

{
  "query": {
    "match_phrase_prefix": {
      "_all": "ti"
    }
  }
}