我必须解决一个超出我对弹性搜索的基本知识的问题。
我有一组对象 - 每个对象都有一组标签。喜欢:
obj_1 = ["a", "b", "c"]
obj_2 = ["a", "b"]
obj_3 = ["c", "b"]
我想使用加权标签搜索对象。例如:
search_tags = {'a': 1.0, 'c': 1.5}
我希望搜索标签是 OR 查询。也就是说 - 我不想排除没有所有查询标签的文档。但我希望它们按权重最大的那个排序(有点:每个匹配的标签乘以其权重)。
使用上面的示例,返回的文档的顺序将是:
- obj_1(得分:1.0+1.5)
- obj_3(得分:1.5)
- obj_2(得分:1.0)
关于文档的结构和查询 ES 的正确方法,最好的方法是什么?
这里有一个类似的问题:Elastic search - tagging strength (nested/child document boosting)只是我不想在索引时指定权重 - 我希望在搜索时完成。
我目前的设置如下。
对象:
[
"title":"1", "tags" : ["a", "b", "c"],
"title":"2", "tags" : ["a", "b"],
"title":"3", "tags" : ["c", "b"],
"title":"4", "tags" : ["b"]
]
我的查询:
{
"query": {
"custom_filters_score": {
"query": {
"terms": {
"tags": ["a", "c"],
"minimum_match": 1
}
},
"filters": [
{"filter":{"term":{"tags":"a"}}, "boost":1.0},
{"filter":{"term":{"tags":"c"}}, "boost":1.5}
],
"score_mode": "total"
}
}
}
问题是它只返回对象 1 和 3。它也应该匹配对象 2(有标签“a”),还是我做错了什么?
按建议更新
好的。将 boost 更改为脚本以计算最小值。删除了最小匹配。我的请求:
{
"query": {
"custom_filters_score": {
"query": {
"terms": {
"tags": ["a", "c"]
}
},
"filters": [
{"filter":{"term":{"tags":"a"}}, "script":"1.0"},
{"filter":{"term":{"tags":"c"}}, "script":"1.5"}
],
"score_mode": "total"
}
}
}
回复:
{
"_shards": {
"failed": 0,
"successful": 5,
"total": 5
},
"hits": {
"hits": [
{
"_id": "3",
"_index": "test",
"_score": 0.23837921,
"_source": {
"tags": [
"c",
"b"
],
"title": "3"
},
"_type": "bit"
},
{
"_id": "1",
"_index": "test",
"_score": 0.042195037,
"_source": {
"tags": [
"a",
"b",
"c"
],
"title": "1"
},
"_type": "bit"
}
],
"max_score": 0.23837921,
"total": 2
},
"timed_out": false,
"took": 3
}
仍然得到错误的顺序,并且缺少一个结果。obj_1 应该在 obj_3 之前(因为它有两个标签)并且 obj_2 仍然完全丢失。怎么会这样?