在我们的弹性搜索中,我们已经为某些人编制索引,其中每个人都可以拥有多个标签。
例如2人(全名 - (标签)):
我们的搜索查询
{
"multi_match": {
"type": "most_fields",
"query": "bart developer",
"operator": "or",
"boost": 5,
"fields": [
"fullname^5",
"taggings.tag.name^5"
],
"fuzziness": 0
}
}
我们正在搜索" bart开发者"。那么我们应该期待Bart Holland应该来到Bart Newman之前,但是因为Bart Newman的全名 bart 而 bart 作为标签,他的得分高于Bart Holland。
有没有办法我可以配置不同单词匹配( bart ,开发者)得分高于一个单词的多个匹配( bart < /强>)。
我已经尝试了和 -operator但没有成功。
谢谢!
答案 0 :(得分:2)
这是most fields
查询所期望的,它是以字段为中心的而不是以术语为中心的,来自文档
most_fields以字段为中心而非以术语为中心:它寻找 最匹配的领域,当我们真正感兴趣的是 最匹配的术语。
另一个问题是Inverse Document Frequency
,这也是你的情况。我想只有少数几个文件的标签名为bart
,这就是为什么它的IDF
非常高,因此得分更高。
如上述链接所示,您应该看到如何使用validate
和explain
对文档进行评分。
有几种方法可以解决这个问题
1)您可以使用custom _all字段,即将full name
和tag
信息复制到包含copy_to
参数的新字段,然后查询,但您必须{ {1}}您的数据
2)我认为更好的解决方案是使用cross fields,需要reindex
方法。来自文档
cross_fields类型首先分析查询字符串以生成a 术语列表,然后在任何字段中搜索每个术语。
它还通过在所有字段中混合来解决term-centric
问题。
这可以解决您的问题。
IDF
希望这有帮助!