我有一个很好的工作搜索查询,它搜索“fiets”,“reparatie”和两个单词组合。 两个单词的结果应该排名最高,但现在最高的结果是有大量rudy或大量测试的文档....
我理解为什么,但我无法弄清楚如何解决这个问题或找到类似的查询/问题。 不知怎的,我应该对这些块进行分组,但我找不到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 } }
}
}
有什么想法吗?
答案 0 :(得分:1)
尝试重新安排查询以遵循此模式:
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
中的条款正在搜索单个字词,我们可以保证更多的字词==更高的分数。
您甚至可以向minimum_should_match
添加bool
子句,并强制要求2/3子句必须匹配等。
通过对每个字词使用multi_match
查询,我们可以查看多个字段,而不关心术语出现的位置。
这只是一种通用模式,您可以对其进行扩展和修改,但这应该可以帮助您入门。
对于此查询模式
,归功于Clinton Gormley答案 1 :(得分:0)
您可以使用_score
它会根据匹配score
对结果进行排序。您的查询将如下所示: -
{
"from" : 0,
"size" : 10,
"query" :
{
"bool" :
{
"should" :
[
...........
.......
}
},
"facets" :
{
.....
},
"sort": [
"_score"
]
}