Привязка результатов Elasticsearch к конкретным идентификаторам

У меня вопрос о Elasticsearch DSL.

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

В мире SQL это будет функциональный эквивалент WHERE id IN(1, 2, 3, 4).

Я исследовал, но нашел документацию Elasticsearch query DSL немного загадочной и лишенной полезных примеров. Может кто-то указать мне верное направление?


person mindtonic    schedule 20.01.2016    source источник


Ответы (5)


Вот пример запроса, который может сработать для вас. Это предполагает, что поле _all включено в вашем индексе (по умолчанию). Он выполнит полнотекстовый поиск по всем полям вашего индекса. Кроме того, с добавленным фильтром ids запрос будет исключать любой документ, идентификатор которого не находится в данном массиве.

{
  "bool": {
    "must": {
      "match": {
        "_all": "your search text"
      }
    },
    "filter": {
      "ids": {
        "values": ["1","2","3","4"]
      }
    }
  }
}

Надеюсь это поможет!

person BrookeB    schedule 22.01.2016
comment
Спасибо Брук! Это именно то, что я искал. Нюансы синтаксиса очень и очень полезны. Большая благодарность. - person mindtonic; 22.01.2016
comment
Да, это довольно мощно. Мне определенно это нравится, просто нужна небольшая помощь в навигации по синтаксису. Спасибо еще раз! - person mindtonic; 22.01.2016
comment
Определенно есть кривая обучения, исходя из фона SQL. Когда у вас будет возможность, я настоятельно рекомендую пройти руководство. Это бесценно, и гораздо проще следовать, чем просто документация. elastic.co/guide/en/elasticsearch/guide/current/ index.html - person BrookeB; 22.01.2016

Как говорил Али Беяд, поле ids в запросе может сделать это за вас. Чтобы дополнить его ответ, я привожу рабочий пример. На случай, если кому в будущем понадобится.

GET index_name/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "field": "your query"
          }
        },
        {
          "ids" : {
            "values" : ["0aRM6ngBFlDmSSLpu_J4", "0qRM6ngBFlDmSSLpu_J4"]
          }
        }
      ]
    }
  }
}
person msayef    schedule 21.04.2021

Вы можете создать логический запрос, который содержит запрос идентификаторов в предложении MUST: https://www.elastic.co/guide/en/elasticsearch/reference/2.0/query-dsl-ids-query.html.

Используя предложение MUST в логическом запросе, ваш поиск будет дополнительно ограничен указанными вами идентификаторами. Я предполагаю, что под идентификаторами вы имеете в виду значение _id для ваших документов.

person Ali Beyad    schedule 21.01.2016
comment
Али Беяд, спасибо за ответ! Не могли бы вы привести полный пример того, как будет выглядеть запрос json? Я хочу выполнить полнотекстовый поиск по всем проиндексированным полям и включить предложение MUST, но все, что я пробовал, приводит к синтаксическим ошибкам, и я нигде не могу найти хороший письменный пример. - person mindtonic; 21.01.2016
comment
@mindtonic: так вы хотите, чтобы и полнотекстовый поиск, и поиск по идентификатору были в одном запросе? - person gfd; 22.01.2016
comment
Я также хотел бы увидеть пример запроса. Добавление его к условию внутри bool ничего не должно делать. - person Tum; 06.09.2019

Согласно документу. , Вы можете

Возвращает документы на основе их идентификаторов.

GET /_search
{
  "query": {
    "ids" : {
      "values" : ["1", "4", "100"]
    }
  }
}
person Sean Gao    schedule 28.01.2021

С elasticaBundle Symfony 5.2

    $query = new Query();
    $IdsQuery = new Query\Ids();
    $IdsQuery->setIds($id);
    $query->setQuery($IdsQuery);
    $this->finder->find($query, $limit);
person Moccine    schedule 28.02.2021