现在我正在学习Elasticsearch,我有很多问题。
最直接的问题是如何按字段的最佳匹配(未过滤)进行排序。
我有以下数据集:
{
"id": 1,
"name": "John Smith",
"categories": ["1", "2"]
},
{
"id": 2,
"name": "John Smith",
"categories": ["2", "3"]
},
{
"id": 3,
"name": "John Doe",
"categories": ["2", "4"]
}
我希望按name
进行搜索,如果结果与categories
上的最佳匹配结果相同,我希望订购。
我当前的查询仅按name
过滤:
{
"query": {
"bool": {
"must": {
"bool": {
"should": [
{
"query_string": {
"query": "*John Smith*",
"fields": ["name"],
"default_operator": "and",
"boost": 10
}
},
{
"match": {
"name": {
"query": "John Smith",
"fuzziness": "AUTO",
"operator": "and"
}
}
}
]
}
}
}
}
}
在这种情况下,结果将是两次点击("id": 1
& "id": 2
),但我希望按categories
排序。例如,如果我还要求"categories": ["3", "4"]
,则第一个结果将是"id": 2
的记录,因为此记录具有匹配的类别(3
)。
如何修改查询以达到此要求?
答案 0 :(得分:0)
你几乎就在那里,虽然我必须说这个问题更多的是关于搜索结果的相关性而不是排序(排序)。
要实现您的目标,您可以在bool
query的should
部分旁边添加must
条款:
{
"query": {
"bool": {
"must": {
"bool": {
"should": [
{
"query_string": {
"query": "*John Smith*",
"fields": ["name"],
"default_operator": "and",
"boost": 10
}
},
{
"match": {
"name": {
"query": "John Smith",
"fuzziness": "AUTO",
"operator": "and"
}
}
}
]
}
},
"should": [
{
"terms": {
"categories": [
"3",
"4"
]
}
}
]
}
}
}
这是因为should
在这种情况下only affects the score,这意味着带来的结果更符合额外条件:
如果
bool
查询位于查询上下文中且有must
或filter
子句然后文档将匹配bool
查询,即使没有should
个查询匹配。在这种情况下,这些条款仅用于 影响得分。
您可以找到有关相关性得分here的更多信息。
希望有所帮助!