Упорядочить результат по наилучшему совпадению на другом поле - PullRequest
0 голосов
/ 11 июня 2018

В настоящее время я изучаю Elasticsearch и у меня много вопросов.

Самый неотложный вопрос, который возникает, состоит в том, как отсортировать по наилучшему совпадению поля (нефильтрованный).

Iиметь следующий набор данных:

{
    "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 голосов
/ 11 июня 2018

Вы почти у цели, хотя я должен сказать, что этот вопрос больше относится к релевантности результатов поиска, чем к упорядочению (сортировке).

Для достижения своей цели вы можете добавить предложение should рядом с * 1004.* часть bool запроса :

{
    "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 в этом случае влияет только на оценку , что означает, что результат будетболее подходящие дополнительные условия:

Если запрос bool находится в контексте запроса и имеет предложение must или filter, то документ будет соответствовать запросу bool, даже если ни один изshould запросов совпадают.В этом случае эти пункты используются только для влияния на оценку.

Вы можете найти более подробную информацию о значении оценки здесь .

Надежда, которая помогает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...