在我们的elasticsearch中,我们索引了一些人,其中每个人都可以有多个taggings。
例如,2人(全名- (taggings)):
我们的搜索查询
{
"multi_match": {
"type": "most_fields",
"query": "bart developer",
"operator": "or",
"boost": 5,
"fields": [
"fullname^5",
"taggings.tag.name^5"
],
"fuzziness": 0
}
}假设我们正在搜索"bart developer“。那么,我们应该期待巴特荷兰应该比巴特纽曼,但因为巴特纽曼有巴特在他的全名和巴特作为标签,他的得分高于巴特荷兰。
有什么方法可以让我在不同单词(bart,developer)上的匹配比一个单词上的多个匹配(bart)更高。
我已经试过了and-operator,但没有成功。
谢谢!
发布于 2016-01-10 07:16:10
这在most fields查询中是一种预期,它是以字段为中心的,而不是以术语为中心的,来自文档。
most_fields是以字段为中心的,而不是以术语为中心的:当我们真正感兴趣的是最匹配的项时,它寻找最匹配的字段。
另一个问题是Inverse Document Frequency,这在您的情况下也是可能的。我想只有很少的文档有标签名为bart,这就是为什么它的IDF非常高,从而得到更高的分数。
如上面的链接所示,您应该了解如何用validate和explain对文档进行评分。
解决这个问题有两种方法。
1)您可以使用全字段,即将full name和tag信息复制到带有copy_to参数的新字段中,然后对其进行查询,但必须对数据进行reindex处理。
2)我认为更好的解决方案是使用交叉场,它采用了term-centric方法。从医生那里
cross_fields类型首先分析查询字符串以生成术语列表,然后在任何字段中搜索每个术语。
它还通过将IDF混合到所有字段来解决它的问题。
这应该能解决你的问题。
{
"query": {
"multi_match": {
"type": "cross_fields",
"query": "bart developer",
"operator": "or",
"fields": [
"fullname",
"tagging.tag.name"
],
"fuzziness": 0
}
}
}希望这能有所帮助!
https://stackoverflow.com/questions/34631940
复制相似问题