Elasticsearch query_string通配符不考虑长度

时间:2019-01-17 21:28:48

标签: elasticsearch

我在Elasticsearch上有一些记录,它们的首字母相同,例如:word,worda,wordab,wordabc,wordabcd。

我正在使用带通配符的query_string:

"query": {
  "bool":{
    "must":[
      {
        "query_string":{
          "query":"word*"
        }
      }
    ]
  }
}

所有匹配都具有相同的分数(“ _score”:1.0),因此顺序是任意的。是否有可能考虑到该词与该词实际匹配的分数?例如,单词匹配术语100%,单词匹配术语80%,依此类推。

1 个答案:

答案 0 :(得分:0)

您为所有匹配的文档获得1分的原因如下-通配符/前缀查询是多项查询,为了执行它们,Elasticsearch需要进行重写(以获取实际的匹配项)

有多种方法可以实现这一目标,默认方法称为constant_score,它分配了所有恒定分数(一个)

有几种不同的ways to rewrite-其中一些会产生不相等的分数,但是这种评分方式将取决于TF-IDF的术语分布(例如 worda 的频率>在匹配的文档中发生,并且整个索引中有多少个文档包含 worda 。作为第一种入门方法,您可以尝试top_terms_1000,然后进行调整。

不幸的是,没有现成的完美方法可以实现预期的行为。

模仿它的一种可能方法是尝试改编Edge NGram tokenizer来从单词abc生成令牌,如下所示:

w, wo, wor, word, ...

在这种情况下,查询可以产生更有意义的分数。为了获得理想的预期结果(匹配百分比),您需要创建自定义查询和评分机制