gpt4 book ai didi

search - Elasticsearch:如何在Bool查询中对搜索词进行分组以获得更多相关性

转载 作者:行者123 更新时间:2023-12-03 02:08:46 26 4
gpt4 key购买 nike

我有一个很好的搜索查询,它可以搜索“fiets”,“reparatie”和两个单词。
两个词的结果应该排名最高,但是现在最高的结果要么是文档,要么是很多建议,要么是很多测试……。

我知道为什么,但是我不知道如何解决这个问题或发现类似的查询/问题。
我应该以某种方式将这些块分组,但是找不到 Elasticsearch 能够理解的语法。

还要注意,这是一个生成的查询,搜索词的数量可以不同。 (可能不是最有效的查询,因为我是Elasticsearch的新手)

{
"from" : 0,
"size" : 10,
"query" :
{
"bool" :
{
"should" :
[
{"term" : { "beschrijving" : "fiets" }},
{"term" : { "beschrijving_lang" : "fiets" }},
{"term" : { "titel" : "fiets" }},
{"multi_match" : { "query" : "fiets", "fields" : [ "naam", "rubriek", "subrubriek","keywords","zoekkeywords" ]}},

{"term" : { "beschrijving" : "reparatie" }},
{"term" : { "beschrijving_lang" : "reparatie" }},
{"term" : { "titel" : "reparatie" }},
{"multi_match" : { "query" : "reparatie", "fields" : [ "naam", "rubriek", "subrubriek","keywords","zoekkeywords" ]}},

{"term" : { "beschrijving" : "fietsreparatie" }},
{"term" : { "beschrijving_lang" : "fietsreparatie" }},
{"term" : { "titel" : "fietsreparatie" }},
{"multi_match" : { "query" : "fietsreparatie", "fields" : [ "naam", "rubriek", "subrubriek","keywords","zoekkeywords" ]}},

{"term" : { "type" : "3000" }}
],
"must" :
[
{"term" : { "actief" : "1" }}
],
"minimum_number_should_match" : 1
}
},
"facets" :
{
"rubriek" : { "terms" : { "field" : "rubriek", "size" : 50 } },
"plaats" : { "terms" : { "field" : "plaats", "size" : 50 } } ,
"provincie" : { "terms" : { "field" : "provincie", "size" : 50 } } ,
"gemeente" : { "terms" : { "field" : "gemeente", "size" : 50 } } ,
"subrubriek" : { "terms" : { "field" : "subrubriek", "size" : 50 } }
}
}

使用multi_match会有所改善,因为在不损失结果的情况下减少了相同关键字的匹配量
{
"from" : 0,
"size" : 10,
"query" :
{
"bool" :
{
"should" :
[
{"match" : {"naam" : {"query" : "test","operator" : "and"}}},
{"term" : { "beschrijving" : "test" }},
{"term" : { "beschrijving_lang" : "test" }},
{"term" : { "titel" : "test" }},
{"match" : {"rubriek" : {"query" : "test","operator" : "and"}}},
{"match" : {"subrubriek" : {"query" : "test","operator" : "and"}}},
{"match" : {"keywords" : {"query" : "test","operator" : "and"} }},
{"match" : {"zoekkeywords" : {"query" : "test","operator" : "and"} }},

{"match" : {"naam" : {"query" : "rudy","operator" : "and"}}},
{"term" : { "beschrijving" : "rudy" }},
{"term" : { "beschrijving_lang" : "rudy" }},
{"term" : { "titel" : "rudy" }},
{"match" : {"rubriek" : {"query" : "rudy","operator" : "and"}}},
{"match" : {"subrubriek" : {"query" : "rudy","operator" : "and"}}},
{"match" : {"keywords" : {"query" : "rudy","operator" : "and"} }},
{"match" : {"zoekkeywords" : {"query" : "rudy","operator" : "and"} }},

{"match" : {"naam" : {"query" : "testrudy","operator" : "and"}}},
{"term" : { "beschrijving" : "testrudy" }},
{"term" : { "beschrijving_lang" : "testrudy" }},
{"term" : { "titel" : "testrudy" }},
{"match" : {"rubriek" :
{"query" : "testrudy","operator" : "and"}}},
{"match" : {"subrubriek" : {"query" : "testrudy","operator" : "and"}}},
{"match" : {"keywords" : {"query" : "testrudy","operator" : "and"} }},
{"match" : {"zoekkeywords" : {"query" : "testrudy","operator" : "and"} }},

{"term" : { "type" : "3000" }}
],
"must" :
[
{"term" : { "actief" : "1" }}
],
"minimum_number_should_match" : 1
}
},
"facets" :
{
"rubriek" : { "terms" : { "field" : "rubriek", "size" : 50 } },
"plaats" : { "terms" : { "field" : "plaats", "size" : 50 } } ,
"provincie" : { "terms" : { "field" : "provincie", "size" : 50 } } ,
"gemeente" : { "terms" : { "field" : "gemeente", "size" : 50 } } ,
"subrubriek" : { "terms" : { "field" : "subrubriek", "size" : 50 } }
}
}

有任何想法吗?

最佳答案

尝试重新排列查询以遵循以下模式:

POST /my_index/_search
{
"query": {
"bool": {
"should": [
{ "multi_match": {
"query": "fiets",
"fields": [ "beschrijving", "beschrijving_lang", "titel" ]
}},
{ "multi_match": {
"query": "reparatie",
"fields": [ "beschrijving", "beschrijving_lang", "titel" ]
}},
{ "multi_match": {
"query": "something_else",
"fields": [ "beschrijving", "beschrijving_lang", "titel" ]
}}
]
}
}
}

只是一个简单的示例,但它显示了总体布局。这个想法是我们希望查询以“以单词为中心”。我们希望与我们更多单词匹配的文档得分更高。 bool自然会给满足更多 should子句的文档打分更高。由于 should中的子句正在搜索单个术语,因此我们可以保证更多的单词==得分更高。

您甚至可以在o​​jit_code中添加 minimum_should_match子句,并强制2/3子句必须匹配,等等。

通过对每个单词使用 bool查询,我们可以查看许多字段,而不必关心该术语的出现位置。

这只是一般模式,您可以扩展和修改它,但这应该可以帮助您入门。

此查询模式归功于Clinton Gormley

关于search - Elasticsearch:如何在Bool查询中对搜索词进行分组以获得更多相关性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20422946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com