在我们的Elasticsearch中,我们索引了一些人,其中每个人可以具有多个标签。
以2个人(全名-(标签))为例:
我们的搜索查询
{
"multi_match": {
"type": "most_fields",
"query": "bart developer",
"operator": "or",
"boost": 5,
"fields": [
"fullname^5",
"taggings.tag.name^5"
],
"fuzziness": 0
}
}
假设我们正在搜索“巴特开发者”。那么我们应该期望Bart Holland会比Bart Newman早,但是因为Bart Newman的全名中有 bart 和 bart 作为标记,所以他的得分要比Bart Holland高。
有没有一种方法可以配置匹配不同单词( bart ,开发人员)的单词,使其得分高于然后匹配一个单词( bart )。
我已经尝试过和 -operator,但没有成功。
谢谢!
最佳答案
这是 most fields
查询所期望的,它是以字段为中心而不是以术语为中心的,来自Docs
另一个问题是 Inverse Document Frequency
,在您的情况下也可能出现。我猜只有很少的文档具有名为bart
的标签,这就是为什么IDF
很高,因此得分更高的原因。
如以上链接所示,您应该看到如何使用validate
和explain
对文档进行评分。
有几种方法可以解决此问题
1)您可以使用custom _all字段,即将full name
和tag
信息都复制到带有copy_to
参数的新字段中,然后对其进行查询,但是您必须对此数据进行reindex
2)我认为更好的解决方案是使用cross fields,它需要term-centric
方法。来自文档
它还通过在所有字段中混合IDF
问题来解决它。
这应该可以解决您的问题。
{
"query": {
"multi_match": {
"type": "cross_fields",
"query": "bart developer",
"operator": "or",
"fields": [
"fullname",
"tagging.tag.name"
],
"fuzziness": 0
}
}
}
希望这可以帮助!
关于elasticsearch - 在Elasticsearch中,不同单词的匹配应得分高于一个单词的多个匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34631940/