通过其他领域的最佳匹配来排序结果

时间:2018-06-11 13:46:54

标签: elasticsearch

现在我正在学习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)。

如何修改查询以达到此要求?

1 个答案:

答案 0 :(得分:0)

你几乎就在那里,虽然我必须说这个问题更多的是关于搜索结果的相关性而不是排序(排序)。

要实现您的目标,您可以在bool queryshould部分旁边添加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查询位于查询上下文中且有mustfilter   子句然后文档将匹配bool查询,即使没有   should个查询匹配。在这种情况下,这些条款仅用于   影响得分。

您可以找到有关相关性得分here的更多信息。

希望有所帮助!