В этой статье я покажу вам, как можно искать по индексам и типам отображения, вместо того чтобы явно определять, по какому индексу и типу отображения искать.
Прежде чем показать вам примеры того, как это сделать, я просто добавлю новый индекс и новый тип отображения в демонстрационных целях, чтобы у меня был некоторый значимый поиск. В прошлый раз, когда я добавлял индекс, я сделал это явно, но я также упоминал, что индекс можно создать неявно, просто добавив новый документ в несуществующий индекс. Поэтому, чтобы продемонстрировать этот подход, я просто добавлю новый документ в индекс, который еще не существует.
Допустим, мы создаем блог для рецептов с примерным именем myfoodblog. Я добавлю индекс с таким именем с типом отображения рецептов. Я просто вставлю PUT-запрос, который добавит документ с рецептом в индекс с именем myfoodblog. Документ содержит только поля название, описание и ингредиенты. Итак, давайте просто выпустим запрос.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | PUT /myfoodblog/recipe/1 { "name": "Pasta Quattro Formaggi", "description": "First you boil the pasta, then you add the cheese.", "ingredients": [{ "name": "Pasta", "amount": "500g" }, { "name": "Fontina cheese", "amount": "100g" }, { "name": "Parmesan cheese", "amount": "100g" }, { "name": "Romano cheese", "amount": "100g" }, { "name": "Gorgonzola cheese", "amount": "100g" }] } |
Этот запрос концептуально идентичен запросу, который я выдал в предыдущей лекции, где я добавлял продукт в индекс электронной коммерции. Разница по сравнению с этим запросом заключается в том, что происходит неявно за кулисами. В предыдущей лекции мы уже создали индекс ecommerce и явно определили тип отображения продукта. В данном случае я не создавал ни индекс, ни тип отображения заранее, но это делается автоматически Elasticsearch в результате данного запроса. Создается тип отображения рецепта, а типы данных полей определяются на основе данных документа с помощью динамического отображения, о котором, как вы помните, я рассказывал ранее в этом курсе.
Давайте проверим, что индекс был создан, перечислив все индексы, используя ту же команду, что и ранее.
1 | GET _cat/indices?v |
Как видно из результатов, индекс myfoodblog был создан, и он содержит один документ. Далее проверим информацию о сопоставлении, которую Elasticsearch автоматически определил для типа сопоставления "рецепт" на основе данных из документа, который я добавил.
1 | GET /myfoodblog |
Как видно из результатов, Elasticsearch определил, что все данные, которые я добавил, были строками, а поле ингредиентов было вложенным полем.
Теперь, когда у меня есть документы в двух индексах и двух типах отображения, я готов выполнить поиск по всем индексам и типам отображения.
1 | GET /ecommerce,myfoodblog/product/_search?q=pasta |
Этот запрос работает с индексами ecommerce и myfoodblog и ищет документ со значением pasta и типом продукта. Для удобства я использовал API строки запроса, потому что важная часть для этой лекции в любом случае находится в URL. Как вы видите, для поиска в нескольких индексах удобно разделять каждый индекс запятой, поэтому в данном случае я ищу в индексах ecommerce и myfoodblog. Хотя я ищу в обоих индексах, я получаю совпадения только в индексе ecommerce, потому что в индексе myfoodblog у меня нет совпадающих документов по типу продукта.
Теперь, когда я показал вам, как искать в нескольких индексах, я покажу вам, как искать в нескольких типах отображения. Как вы уже догадались, это также делается путем разделения типов запятой, поэтому я просто добавлю в запрос тип рецепта.
1 | GET /ecommerce,myfoodblog/product,recipe/_search?q=pasta&size=15 |
Обратите внимание, что я добавил параметр размера. Причина в том, что у меня есть 10 совпадающих документов в индексе ecommerce и один в индексе myfoodblog. Поскольку размер набора результатов по умолчанию равен 10, документ из индекса myfoodblog будет исключен из-за того, как оцениваются документы. Поэтому я увеличил размер набора результатов до 15, чтобы показать вам совпадающие документы из обоих индексов. Я обсужу параметр размера в одной из последующих лекций, поэтому пока не обращайте на него внимания. Результаты содержат документы из обоих индексов.
Следует отметить, что при поиске по нескольким индексам и типам отображения метаполя _index и _type весьма полезны. Это связано с тем, что они позволяют узнать, к какому индексу или типу относится данный документ. Скажем, например, существуют разные правила отображения для продуктов и рецептов. Проверив эти мета-поля, вы можете добавить различную логику, основанную, например, на типе отображения документа.
Есть еще одна небольшая функция, о которой я хочу упомянуть. Можно включать и исключать индексы, дополняя имена индексов знаками плюс или минус соответственно. Я покажу вам, как это сделать, набрав запрос, очень похожий на предыдущий.
1 | GET /-ecommerce,%2Bmyfoodblog/product,recipe/_search?q=pasta |
В этом запросе я исключаю документы, которые хранятся в индексе ecommerce, добавляя к имени индекса дефис. Вам, вероятно, интересно, почему я поставил префикс %2B для индекса myfoodblog. Я сделал это потому, что в URL знак плюс интерпретируется как пробел, поэтому, чтобы избежать этого, я закодировал знак плюс в URL. Если бы я этого не сделал, Elasticsearch интерпретировал бы знак плюс как пробел и выдал бы ошибку. Результатом этого запроса будут документы типов product и recipe в индексе myfoodblog, которые соответствуют термину pasta.
Наконец, я хочу быстро показать вам несколько запросов, первый из которых - поиск по всем типам.
1 | GET /ecommerce/_search?q=pasta |
Просто оставив в URL любой тип, Elasticsearch будет искать любой тип. В данном случае любой тип может соответствовать индексу ecommerce. Ранее в этой лекции я показал вам, как искать в конкретных индексах. Также можно искать во всех индексах в кластере, используя заполнитель _all.
1 | GET /_all/product/_search?q=pasta |
В этом примере я ищу документы типа product в любом индексе кластера. Если бы я хотел искать документы любого типа, я мог бы просто удалить тип из URL, или упростить запрос.
1 | GET /_search?q=pasta |
Просто убрав информацию о том, в каких индексах или типах искать, Elasticsearch будет искать по всем индексам и всем типам.