ElasticSearch сортирует поле в результате на основе запроса - PullRequest
0 голосов
/ 24 января 2020

У меня есть модель данных ElasticSearch, подобная этой:

  {
    "_index": "index_name",
    "_type": "_doc",
    "_id": "26177",
    "_score": 1.0,
    "_source": {
      "primary_name": "Megatron Industries",
      "some_value": "",
      "search_names": [
        "Optimus",
        "Prime",
        "Lorem"
      ]
    }
  },

В настоящее время я выполняю запрос, подобный этому:

{
    "query": {
        "query_string" : {
            "query" : "lorem",
            "fields"  : ["search_names"]
        }
    }
}

Итак, я запрашиваю документы на основе значения в search_names.

На веб-сайте, если кто-то проводит поиск записи с именем «lorem», я бы вернул эту запись с указанием «основного имени», а затем список их имен_поисков с надписью «также известный как».

Моя проблема в том, что небольшое количество этих записей имеют более 1000 'search_names', поэтому мне придется ограничить количество показанных 'search_names', но я хочу убедиться, что 'search_name' это ближе всего к их запросу показано в верхней части «также известный как».

Чтобы уточнить, я доволен порядком результатов поиска, но я собираюсь отсортировать значение одного из полей в результатах поиска на основе запроса.

Это то, что я могу сделать в ElasticSearch?

В качестве вторичной цели, после того как она отсортирована, я могу каким-либо образом ограничить количество результатов, возвращаемых в поле search_names, до 10, но также предоставить другое поле, которое включает общее количество в виде числа?

Таким образом, я мог бы показать в результатах поиска:

  • Основное имя: Megatron Industries
  • Также известный как: Optimus, prime, ... и 990 других имен.

Спасибо,

1 Ответ

0 голосов
/ 29 января 2020

Оказывается, решение было довольно простым. Мне просто нужно было добавить подсветку в поле search_names. ElasticSearch автоматически отсортирует и выделит поле на основе соответствия запроса. Я смог ограничить результаты, установив number_of_fragments в выделении. Тогда я просто исключил исходное поле из результата. Запрос ниже.

{
    "_source": {
        "excludes": [ "search_names" ]
    },
    "query": {
        "query_string" : {
            "query" : "Lorem ipsum",
            "fields"  : ["search_names"]
        }
    },
    "highlight": {
        "fields": {
            "search_names": { 
                "fragment_size" : 1000,
                "no_match_size" : 1000,
                "number_of_fragments" : 10,
                "pre_tags" : ["<b>"],
                "post_tags" : ["</b>"]
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...