извлекать только определенные документы _index в обращениях elasticsearch при запросе по нескольким индексам

Я запрашиваю два индекса в одном запросе elasticsearch, поэтому я могу агрегировать их оба одновременно. Проблема в том, что я хочу, чтобы в хитах был только один из индексных документов, а не оба. Следовательно, я хотел бы отфильтровать поле _index в запросе.

Запрос

http://localhost:9200/products,stores/_search

{
    query: {
        match_all: {}
    },
    aggs = {
        stores : { terms: { field: 'store_name' } }
    }
}

Пример вывода

{"hits" :[{"_index": "products",
 "_type": "_doc",
 "_id": "PFS0OTD5UE",
 "_score": 123.057205,
 "_source": {}},

{"_index": "stores",
 "_type": "_doc",
 "_id": "SXBT3ER",
 "_score": 53.057205,
 "_source": {}}]}

Я хочу получить только индекс продукта.


person Fayad    schedule 12.06.2020    source источник
comment
Не могли бы вы обновить вопрос с вашими сопоставлениями, образцами документов этих двух индексов и запросом, который вы пробовали. Это было бы полезно.   -  person Opster ES Ninja - Kamal    schedule 13.06.2020
comment
В качестве альтернативы не могли бы вы сообщить мне, присутствует ли поле, например, для my_field, для которого вы выполняете эту агрегацию, в обоих индексах?   -  person Opster ES Ninja - Kamal    schedule 13.06.2020
comment
Я говорю о поле _index, которое включается в каждый результат поиска с помощью elasticsearch. Я просто хотел бы отфильтровать это, если это возможно.   -  person Fayad    schedule 13.06.2020
comment
Не могли бы вы опубликовать запрос, который у вас есть? Это было бы полезно.   -  person Opster ES Ninja - Kamal    schedule 13.06.2020
comment
То, что вы опубликовали, это response. Если вы можете предоставить запрос request, я могу быстро проверить и поделиться с вами тем, что нужно сделать.   -  person Opster ES Ninja - Kamal    schedule 13.06.2020
comment
я обновил вопрос   -  person Fayad    schedule 13.06.2020
comment
Итак, если я правильно понимаю, вы хотите, чтобы результаты агрегирования возвращались из обоих индексов, однако вы хотите возвращать документы/попадания только из одного из двух индексов. Я не думаю, что это возможно. Возможно, вам придется управлять этим на уровне вашего приложения. Что бы вы ни упомянули в запросе, агрегация будет применяться к документам, подпадающим под этот запрос. Таким образом, если вы добавите фильтр к _index в запросе, агрегация также будет применяться к документам только из этого индекса.   -  person Opster ES Ninja - Kamal    schedule 13.06.2020
comment
И если вы просто хотите использовать один индекс, просто запросите этот единственный индекс. Дайте мне знать, если мое понимание неверно, и, пожалуйста, уточните, что именно вы ищете.   -  person Opster ES Ninja - Kamal    schedule 13.06.2020
comment
Вы правильно понимаете. Думаю, я позабочусь об этом на прикладном уровне. Благодарю вас!   -  person Fayad    schedule 13.06.2020
comment
Также я только что увидел этот вопрос, который вы разместили некоторое время назад. Я настоятельно рекомендую иметь один индекс, который может лучше помочь в этом случае. Да, это правильно, что будет много избыточности, однако для этого предназначен Elasticsearch. И если вы решили остаться с двумя индексами, вам придется управлять логикой соединения на уровне приложения.   -  person Opster ES Ninja - Kamal    schedule 13.06.2020
comment
Да, мой последний вопрос связан с этой проблемой. Вы предлагаете поместить как документы магазинов, так и документы продуктов в один индекс. Проблема в том, что магазины для каждого отдельного продукта увеличиваются в размерах, что делает размер документа намного больше и требует множества обновлений для каждого документа.   -  person Fayad    schedule 13.06.2020
comment
Я подумал о том, чтобы иметь идентификаторы продуктов в документах магазина и выполнить два запроса. Один в индексе продукта, извлеките идентификаторы продукта из обращений и используйте для запроса индекса магазинов. Проблема заключается в размере возвращаемого результата, поэтому я бы не хотел извлекать большой размер обращений для обработки на сервере.   -  person Fayad    schedule 13.06.2020
comment
ES не поддерживает операции соединения в отношении того, что вы ищете. Что ж, у них есть концепция «родитель-потомок», но даже в этом случае сами ES не рекомендуют, если только один из них не превосходит числом других индексных документов. Вероятно, вы можете попробовать использовать nested документы при использовании одного индекса, но опять же нам нужно переосмыслить наилучший возможный способ сделать это в зависимости от размера документа, как часто вы получаете обновления для них, шаблоны запросов и т. д. Дайте мне знать, когда вы будете доступны чтобы мы могли лучше понять, что вы намерены запрашивать.   -  person Opster ES Ninja - Kamal    schedule 13.06.2020
comment
Давайте продолжим это обсуждение в чате.   -  person Fayad    schedule 13.06.2020


Ответы (1)


Это определенно возможно с помощью post_filter:

POST products,stores/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "stores": {
      "terms": {
        "field": "store_name"
      }
    }
  },
  "post_filter": {
    "term": {
      "_index": "products"
    }
  }
}

Агрегирование будет выполняться для всех документов из обоих индексов, но только документы из products будут возвращены в совпадениях.

person Val    schedule 13.06.2020