Как исключить большое количество идентификаторов из запроса Elastic Search

Я работаю над приложением, похожим на Tinder. В ElasticSearch у меня есть коллекция из примерно полумиллиона пользователей и их местоположений). Всякий раз, когда пользователь открывает приложение для поиска ближайших пользователей, я запускаю запрос Elastic Search для этой коллекции. Запрос довольно сложный, он учитывает не только местоположение, но и то, насколько активен пользователь или сколько у него фотографий.

С чем я борюсь, так это с тем, как исключить из запроса тех пользователей, которых текущий пользователь уже пролистал. Наивным способом реализации этого, вероятно, было бы сохранение вложенного массива идентификаторов пользователей как части каждого пользовательского документа в индексе и исключение на его основе. Но так как каждый пользователь делает десятки тысяч свайпов, этот массив потенциально может стать очень большим, поэтому это не масштабируемое решение.

Есть ли способ исключить большое количество объектов из запроса Elastic Search на основе их идентификаторов, который не влияет на производительность?

2 ответа

Решение

Используйте функцию поиска запроса Условия: механизм поиска терминов

Когда необходимо указать фильтр терминов с большим количеством терминов, может быть полезно извлечь эти значения терминов из документа в индексе. Конкретным примером будет фильтрация твитов ваших твиттеров. Потенциально количество идентификаторов пользователей, указанных в фильтре терминов, может быть много. В этом сценарии имеет смысл использовать механизм поиска терминов фильтра терминов.

Вы можете попробовать добавить ids фильтровать в bool/must_not пункт вашего сложного запроса и посмотреть, как он себя ведет.

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
              ...                <--- your other "must" constraints
          ],
          "must_not": [
            {
              "ids": {
                "values": [ "id1", "id2", "id3" ]  <--- your list of ids to exclude
              }
            }
          ]
        }
      }
    }
  }
}
Другие вопросы по тегам