В личной практике ElasticSearch используется в качестве реляционной базы данных, а таблицы с более чем 1000w данных в Mysql хранятся в ES, поэтому вместо полнотекстового поиска используются все запросы с точными словами. , игнорируются соответствующие функции, такие как баллы, связанные с полнотекстовым поиском, которые будут введены в последующую практику поисковых систем.
На этой карте мозга мы в основном представляем некоторые механизмы, связанные с поиском. Краткое описание рисунка приведено ниже.
Простой запрос
Как упоминалось выше, операции ES управляются на основе JSON, поэтому, будь то простой запрос или сложный запрос, ES реализуется через разные объекты JSON.
Это всего лишь простое описание, его удобно запоминать через карту мозга, а конкретную операцию видноElasticSearch — Java-API
процесс запроса
-
логика запроса
- Стадия дивергенции:
- Стадия сбора:
-
тип поиска
Порядок и метод выполнения запроса и т. д., по умолчанию — query_then_fetch, что соответствует приведенной выше логике запроса.Теперь запрашиваются все осколки для сортировки и оценки документов, а затем запрашиваются фактические документы на соответствующих осколках.
Есть и другие типы, такие как query_and_fetch, dfs_query_and_fetch, dfs_query_then_fetch и т. д., которые можно указать при поиске:http://localhost:9200/index/search?pretty=true&search_type=query_and_fetch
-
Настройки выполнения поиска
Определяет, происходит ли запрос на мастере или реплике, заданной параметром preference=xxxx.
http://localhost:9200/index/_search?preference=_primary
Поиск выполняется только на основном шарде, реплики не используются. Когда вы хотите использовать последний обновленный индекс в индексе, который не был скопирован в реплику Информация в , это очень полезно.
Базовый запрос
В ES есть много типов запросов, вот некоторые распространенные методы использования.
-
Входной запрос
Он соответствует только документам, которые содержат термин в данном поле, в то время как и являются точными, неанализированными терминами
{
"query" : {
"term" : {
"title" : "crime"
}
}
}
Приведенный выше запрос сопоставит документы со словом «преступление» в поле заголовка. Помните, что запросы терминов не анализируются, поэтому
Для предоставления терминов, которые точно соответствуют терминам в проиндексированном документе.
Этот метод имеет тот же эффект, что и утверждение «=» (эквивалентное) в традиционном SQL.
-
Запрос с несколькими входами
Запросы терминов позволяют сопоставлять один неанализируемый термин, а запросы с несколькими терминами можно использовать для сопоставления нескольких таких терминов.
{ "query" : { "terms" : { "tags" : [ "novel", "book","hello" ], "minimum_match" : 1 } } }
Как и выше, приведенный выше запрос возвращает все документы, содержащие одно или два условия поиска в поле тегов. Почему? Это потому что мы Установите для свойства Minimum_match значение 1; это означает, что должен совпадать хотя бы 1 термин. Если вы хотите, чтобы запрос соответствовал всем словам документации статьи, вы можете установить для свойства Minimum_match значение 2.
Когда Minimum_match=1, это похоже на оператор "in" в SQL. -
запрос диапазона
Запросы диапазона позволяют нам находить документы, в которых значение поля находится в диапазоне. Поля могут быть числовыми или строковыми (будут сопоставлены с другим запросом Apache Lucene). Запросы диапазона могут быть нацелены только на одно поле.
{ "query" : { "range" : { "year" : { "gte" : 1700, "lte" : 1900 } } } }
Найти все книги с полем года от 1700 до 1900
Аналогично ">","=","
Составной запрос
Составные запросы поддерживают возможность объединения нескольких запросов или изменения поведения других запросов.
-
логический запрос
Составные запросы поддерживают возможность объединения нескольких запросов или изменения поведения других запросов. Существуют в основном следующие типы разъемов.
- must : логический запрос, инкапсулированный им, должен совпадать, чтобы документ возвращал что-то вроде «и»
- должен: инкапсулированный им логический запрос может совпадать или не совпадать, как "или"
- must_not: логический запрос, инкапсулированный им, не должен совпадать, документ вернет что-то вроде "!="
{
"query" : {
"bool" : {
"must" : {
"term" : {
"title" : "crime"
}
},
"should" : {
"range" : {
"year" : {
"from" : 1900,
"to" : 2000
}
}
},
"must_not" : {
"term" : {
"otitle" : "nothing"
}
}
}
}
}
Найдите все документы, в поле заголовка которых есть термин «преступление», а в поле «Год» можно найти в Он также не может находиться в диапазоне 1900~2000, а в поле заголовка не может быть введено ничего.
Фильтрация результатов запроса
Фильтры можно использовать для фильтрации результатов запроса. Например, если выбрано подмножество индекса, не влияющее на итоговую оценку, можно использовать фильтр.
В общем, фильтры следует использовать везде, где это возможно.Фильтры не влияют на оценку, а расчеты усложняют поиск и требуют ресурсов ЦП. Фильтрация, с другой стороны, является относительно простой операцией.. Поскольку фильтрация применяется к содержимому всего индекса, результаты фильтрации не зависят ни от найденных документов, ни от отношений между документами.Фильтры легко кэшируются, тем самым повышая общую производительность запроса фильтра.
Фильтр выполняется перед выполнением запроса, поэтому производительность выше, и фильтр следует использовать как можно чаще.
{
"query": {
"filtered" : {
"query" : {
"match" : {
"title" : "Catch-22"
}
},
"filter" : {
"term" : {
"year" : 1961
}
}
}
}
}
Найдите Catch-22 в поле заголовка и добавьте к нему фильтр, чтобы отображались только документы с годом = 1961.
Общие фильтры
- фильтр терминов
- фильтр терминов
- и фильтровать
- или фильтровать
- логический фильтр
Продолжение следует!!!!!!