弹性搜索match_phrase_prefix无法找到所有记录

时间:2014-08-25 12:00:02

标签: database search elasticsearch

我们正在使用弹性搜索1.1.0。我们正在尝试使用match_phrase_prefix查询索引,如下所示:

{
    "query":{
      "match_phrase_prefix" : {
        "name" : {
          "query" : "Harry Joy"
        }
      }
    }
}

我们有4条名为Harry Joy的唱片。如果我们写全名,上面的查询工作得很好,但是如果我们写了名字和名字的第一个字符,它只返回1个记录而不是4个。

以下查询仅返回1条记录:

{
    "query":{
      "match_phrase_prefix" : {
        "name" : {
          "query" : "Harry J"
        }
      }
    }
}

但是以下查询会返回所有4条记录:

{
    "query":{
      "match_phrase_prefix" : {
        "name" : {
          "query" : "Harry Jo"
        }
      }
    }
}

我们需要能够在第二个单词中使用单个字符搜索所有4个字符。我们可以在这里做些什么才能使它工作?没有用1个字符搜索并在第二个字中使用2个字符的原因是什么?

这就是我创建索引的方式:

{
    "river": "users", 
    "data": {
        "type": "mongodb", 
        "mongodb": { 
           "servers": [
                   { "host": "localhost", "port": 27017 }
             ],
            "db": "mydb", 
            "collection": "users", 
            "gridfs": false
        }, 
        "index": { 
            "name": "susers", 
            "type": "users" 
        }
    }
}

1 个答案:

答案 0 :(得分:0)

对于match_phrase_prefix,max_expansions的默认值为50。 这意味着对于术语“ Harry J” ,elastic将在排序的术语词典中查找前50个术语的“ J” 。它将使用最多50(max_expansions)的字典顺序将其组合到查询中(例如:“ Jane”,“ Joy”,“笑话”)。

(这就是为什么当您的术语为“ Harry Jo” 时会找到所有4条记录的原因,因为在排序的术语词典中更容易找到“ Jo” 前50个词)。

您可以使用以下查询来增加max_expansions: (使用大量的max_expansions会降低性能)

{
"query":{
  "match_phrase_prefix" : {
    "name" : {
      "query" : "Harry J",
      "max_expansions" : 100
    }
  }
}
}

更多信息,您可以在这里找到:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase-prefix.html#query-dsl-match-query-phrase-prefix