我在Elasticsearch上有一些记录,它们的首字母相同,例如:word,worda,wordab,wordabc,wordabcd。
我正在使用带通配符的query_string:
"query": {
"bool":{
"must":[
{
"query_string":{
"query":"word*"
}
}
]
}
}
所有匹配都具有相同的分数(“ _score”:1.0),因此顺序是任意的。是否有可能考虑到该词与该词实际匹配的分数?例如,单词匹配术语100%,单词匹配术语80%,依此类推。
答案 0 :(得分:0)
您为所有匹配的文档获得1分的原因如下-通配符/前缀查询是多项查询,为了执行它们,Elasticsearch需要进行重写(以获取实际的匹配项)>
有多种方法可以实现这一目标,默认方法称为constant_score
,它分配了所有恒定分数(一个)
有几种不同的ways to rewrite-其中一些会产生不相等的分数,但是这种评分方式将取决于TF-IDF的术语分布(例如 worda 的频率>在匹配的文档中发生,并且整个索引中有多少个文档包含 worda 。作为第一种入门方法,您可以尝试top_terms_1000
,然后进行调整。
不幸的是,没有现成的完美方法可以实现预期的行为。
模仿它的一种可能方法是尝试改编Edge NGram tokenizer来从单词abc生成令牌,如下所示:
w, wo, wor, word, ...
在这种情况下,查询可以产生更有意义的分数。为了获得理想的预期结果(匹配百分比),您需要创建自定义查询和评分机制