Elasticsearch匹配短语前缀与所有术语不匹配

时间:2017-11-08 14:20:50

标签: elasticsearch match missing-data querying

我遇到一个问题,当我在Elasticsearch中使用match_phrase_prefix查询时,它没有返回我期望的所有结果,特别是当查询是一个单词后跟一个字母时。

采用此索引映射(这是一个用于保护敏感数据的人为例子):

http://localhost:9200/test/drinks/_mapping

返回:

{
  "test": {
    "mappings": {
      "drinks": {
        "properties": {
          "name": {
            "type": "text"
          }
        }
      }
    }
  }
}

其中包括数以百万计的其他记录:

{
    "_index": "test",
    "_type": "drinks",
    "_id": "2",
    "_score": 1,
    "_source": {
        "name": "Johnnie Walker Black Label"
    }
},
{
    "_index": "test",
    "_type": "drinks",
    "_id": "1",
    "_score": 1,
    "_source": {
        "name": "Johnnie Walker Blue Label"
    }
}

以下查询,即一个单词后跟两个字母:

POST http://localhost:9200/test/drinks/_search
{
    "query": {
        "match_phrase_prefix" : {
            "name" : "Walker Bl"
        }
    }
}

返回:

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 2,
        "max_score": 0.5753642,
        "hits": [
            {
                "_index": "test",
                "_type": "drinks",
                "_id": "2",
                "_score": 0.5753642,
                "_source": {
                    "name": "Johnnie Walker Black Label"
                }
           },
           {
               "_index": "test",
               "_type": "drinks",
               "_id": "1",
               "_score": 0.5753642,
               "_source": {
                   "name": "Johnnie Walker Blue Label"
                }
            }
        ]
    }
}

这个查询只有一个单词和一个字母:

POST http://localhost:9200/test/drinks/_search
{
    "query": {
        "match_phrase_prefix" : {
            "name" : "Walker B"
        }
    }
}

不会返回任何结果。这可能会发生什么?

1 个答案:

答案 0 :(得分:4)

我将假设您正在使用Elasticsearch 5.0及更高版本。 我认为可能是因为max_expansions的默认值。

如文档here所示,max_expansions参数用于控制最后一个术语扩展的前缀数。默认值为50,它可以解释为什么你会找到带有两个第一个字母B和L的“黑色”和“蓝色”,但不能仅用B来找到它。

文档很清楚:

  

match_phrase_prefix查询是一个穷人的自动完成。它非常易于使用,让您可以快速开始使用“按类型搜索”,但结果通常很好,有时会让人感到困惑。

     

考虑查询字符串quick brown f。此查询通过创建快速和棕色的短语查询(即术语快速必须存在,并且必须后跟术语棕色)来工作。然后它查看已排序的术语词典以查找以f开头的前50个术语,并将这些术语添加到词组查询中。

     

问题在于,前50个术语可能不包括术语狐狸,因此找不到阶段快速棕狐。这通常不是问题,因为用户将继续输入更多字母,直到他们正在寻找的单词出现

我不能告诉你,如果你因为我从未尝试过自己而努力寻找好的表现,是否可以将这个参数增加到50以上。