繁体   English   中英

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

[英]Elasticsearch match phrase prefix not matching all terms

我遇到了一个问题,当我在 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"
        }
    }
}

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

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

正如此处的文档中所见, max_expansions 参数用于控制最后一项将使用多少前缀进行扩展。 默认值是 50,它可以解释为什么你会发现“黑色”和“蓝色”的前两个字母 B 和 L,而不是只有 B。

文档对此非常清楚:

match_phrase_prefix 查询是穷人的自动完成。 它非常易于使用,让您可以快速开始使用“即输入搜索”,但其结果通常已经足够好,但有时会令人困惑。

考虑查询字符串 quick brown f。 该查询的工作原理是创建一个基于 quick 和 brown 的短语查询(即术语 quick 必须存在并且后面必须跟有术语 brown)。 然后它查看已排序的术语字典以查找以 f 开头的前 50 个术语,并将这些术语添加到短语查询中。

问题是前 50 个术语可能不包括术语 fox,因此不会找到相 quick brown fox。 这通常不是问题,因为用户会继续输入更多字母,直到出现他们要查找的单词

如果您正在寻找良好的性能,我无法告诉您是否可以将此参数增加到 50 以上,因为我自己从未尝试过。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM