Максимальное количество документов Elasticsearch для каждого индекса

У меня есть два отдельных индекса A и B с псевдонимом X. Оба индекса имеют одинаковую структуру документа. Когда я ищу с размером = 20 по псевдониму X, я хочу установить максимальный размер документа 5 для индекса B. Результат поиска должен содержать максимум 5 документов из индекса B. Если в индексе B нет документа, результат поиска должен содержать 20 документов. из индекса А.

Есть ли какое-либо решение для установки максимального количества документов на индекс для поиска по нескольким индексам с псевдонимом?


person mstzn    schedule 13.06.2019    source источник


Ответы (1)


Этого можно добиться с помощью _msearch. API.

Ниже приведен пример запроса о том, как вы можете применить это:

POST myalias/_msearch
{"index" : "myindex_news_sports"}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 1}
{"index" : "myindex_news_economics"}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 1}

По сути, _msearch позволяет выполнять поиск по нескольким запросам с использованием одного и того же API. Есть два разных запроса, в которых вы можете указать size для двух разных индексов.

Обратите внимание, что результаты будут отображаться в отдельных группах JSON (два результата, по одному для каждого запроса).

Пример ответа:

{
  "took" : 4,
  "responses" : [
    {                                  <---- Response for Index 1
      "took" : 4,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 2,
          "relation" : "eq"
        },
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "myindex_news_sports",
            "_type" : "_doc",
            "_id" : "2",
            "_score" : 1.0,
            "_source" : {
              "fooNested" : {
                "sigma" : 9,
                "theta" : 1
              }
            }
          },
          {
            "_index" : "myindex_news_sports",
            "_type" : "_doc",
            "_id" : "4",
            "_score" : 1.0,
            "_source" : {
              "fooNested" : {
                "sigma" : 9,
                "theta" : 1
              }
            }
          }
        ]
      },
      "status" : 200
    },
    {                                  <---- Response for Index 2
      "took" : 2,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 4,
          "relation" : "eq"
        },
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "myindex_news_economics",
            "_type" : "_doc",
            "_id" : "2",
            "_score" : 1.0,
            "_source" : {
              "fooNested" : {
                "sigma" : 9,
                "theta" : 1
              }
            }
          },
          {
            "_index" : "myindex_news_economics",
            "_type" : "_doc",
            "_id" : "1",
            "_score" : 1.0,
            "_source" : {
              "fooNested" : {
                "sigma" : 9,
                "theta" : 1
              }
            }
          }
        ]
      },
      "status" : 200
    }
  ]
}

Не уверен, что это было бы идеально для вас, я просто надеюсь, что это поможет.

person Opster ES Ninja - Kamal    schedule 13.06.2019
comment
msearch обеспечивает разбиение на страницы по индексу. Но я хочу сделать разбивку на страницы по двум индексам с псевдонимом? Есть ли какое-либо решение, которое обеспечивает глобальную разбивку на страницы для двух ответов в msearch @Kamal? - person mstzn; 13.06.2019
comment
Невозможно. Вам придется управлять этим на стороне клиента, отправляя два запроса транзакционным способом, а затем объединяя результаты, что, я думаю, более или менее похоже на _msearch. Могу ли я узнать, сортируете ли вы свои результаты по баллам. - person Opster ES Ninja - Kamal; 13.06.2019
comment
Да, сортировка основана на баллах. Нехорошо управлять разбиением на страницы на стороне клиента. В каждом поиске я хочу установить максимальное количество документов для индекса B. - person mstzn; 13.06.2019
comment
Если ваша сортировка основана на _score, делая то, что вы делаете, я не уверен, каков ваш вариант использования, но результаты могут быть неправильными. Потому что ваш вариант использования требует отображения документа с меньшим значением релевантности одного индекса над документами с более релевантным из другого индекса. Мне нравится думать, что именно поэтому, когда дело доходит до таких вариантов использования, люди из ES разработали _msearch вместо того, чтобы иметь его таким, каким вы хотели бы, чтобы предотвратить такой, на мой взгляд, неправильный порядок результатов. Но я боюсь, хотя ваш вариант использования может быть действительным, то, о чем вы просите, невозможно в ES. - person Opster ES Ninja - Kamal; 13.06.2019
comment
Эта функциональность не поддерживается ES. msearch может быть решением для моего случая. Я приму ваш ответ. Спасибо. - person mstzn; 13.06.2019