例如,我有索引pizzas
。我有Bool过滤器
"bool": {
"should": {
"toppings": [
{
"query": "Tomatoes"
},
{
"query": "Mushrooms"
}
]
}
}
ElasticSearch可以为索引中的所有比萨返回匹配百分比,因此所有具有mushrooms XOR tomatoes
的比例将返回50%,如果两者都是100%。和其他配料无关。
如果是,我们可以通过这种方式扩展此功能,因此我们可以为每个顶部重量值添加。 例如,我对西红柿(50),蘑菇(75)和辣椒(100)感兴趣。 总而言之,它将是50 + 75 + 100 = 225 所以Margherita的西红柿和Muchrooms = 125。 所以这个披萨匹配百分比应该回到56%(125/225)附近。
我阅读了ElasticSearch指南,阅读了数百次API文档,尝试了过滤器,查询,minimum_should_match,boost。我将非常感谢至少在哪里进一步搜索。
答案 0 :(得分:0)
我可以看到三种不同的方法来执行这个
命名查询
您可以在bool中使用named query,查看与每个文档匹配的所有查询。在客户端,您可以计算每个顶部的值并自己找到总和。
功能评分查询
{
"query": {
"function_score": {
"filter": {
"terms": {
"toppings": [
"Tomatoes",
"Mushrooms",
"chillies"
]
}
},
"functions": [
{
"weight": 100,
"filter": {
"toppings": "chillies"
}
},
{
"weight": 50,
"filter": {
"toppings": "Tomatoes"
}
},
{
"weight": 75,
"filter": {
"toppings": "Mushrooms"
}
}
],
"score_mode": "sum",
"boost_mode": "replace"
}
}
}
在上述文件中,辣椒或西红柿或蘑菇将匹配。对于存在的任何过滤器,它将创建一个增强值并添加它。因此,函数给出的分数是您要查找的总和。现在这被查询分数取代。因此,文件的分数将是您要查找的数字。
脚本字段方法
您需要使用script field。这将为每个文档创建一个额外的字段,使用脚本
计算您要查找的总和