Поисковый запрос — это запрос информации о данных в потоке данных или индексе Elasticsearch.
Вы можете думать о запросе как о вопросе, написанном таким образом, который понимает Elasticsearch. На основе ваших данных вы можете использовать запросы, чтобы получить ответы на такие вопросы, как:
- Каким процессам на сервере требуется более 500 мс времени отклика?
- Какие пользователи в моей сети запускали regsvr32.exe на прошлой неделе?
- Какие страницы моего веб-сайта содержат определенные слова или фразы?
Поиск состоит из одного или нескольких запросов, которые объединяются и отправляются в Elasticsearch. Документы, соответствующие поисковому запросу, возвращаются в подсчете ответов или результатах поиска.
Поиски могут также содержать дополнительную информацию, чтобы лучше обрабатывать их запросы. Например, поиск может быть ограничен определенным индексом или возвращать только определенное количество результатов.
Run a search
ты можешь использовать этоsearch APIПоиск и агрегирование данных, хранящихся в потоках или индексах Elasticsearch. Параметр тела запроса API принимаетQuery DSLписьменный запрос.
Следующий запрос используетmatchпоиск запросаmy-index-000001. Этот запрос сопоставляет документы со значением user.id, равным kimchy.
GET /my-index-000001/_search
{
"query": {
"match": {
"user.id": "kimchy"
}
}
}
Ответ API возвращает первые 10 документов в свойстве hits.hits, которые соответствуют запросу.
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.3862942,
"hits": [
{
"_index": "my-index-000001",
"_type": "_doc",
"_id": "kxWFcnMByiguvud1Z8vC",
"_score": 1.3862942,
"_source": {
"@timestamp": "2099-11-15T14:12:12",
"http": {
"request": {
"method": "get"
},
"response": {
"bytes": 1070000,
"status_code": 200
},
"version": "1.1"
},
"message": "GET /search HTTP/1.1 200 1070000",
"source": {
"ip": "127.0.0.1"
},
"user": {
"id": "kimchy"
}
}
}
]
}
}
Common search options
Вы можете использовать параметры ниже, чтобы настроить поиск.
Query DSL
Query DSLПоддерживается несколько типов запросов, и вы можете смешивать и сочетать их, чтобы получить желаемые результаты. Типы запросов включают в себя:
- Booleanи другиеcompoundЗапросы, которые позволяют комбинировать запросы и сопоставлять результаты на основе нескольких критериев.
- Term-levelЗапрос для фильтрации и поиска точных совпадений
- Full textзапрос, часто используемый в поисковых системах
- GeoиspatialЗапрос
Aggregations
ты можешь использовать этоsearch aggregationsдля получения статистики и др. Анализ результатов поиска. Агрегации помогают ответить на следующие вопросы:
- Каково среднее время отклика моего сервера?
- К каким наиболее важным IP-адресам обращаются пользователи в моей сети?
- Каков общий доход от транзакций клиента?
Search multiple data streams and indices
Вы можете использовать значения, разделенные запятыми, и шаблон индекса, подобный grep, для поиска по нескольким потокам и индексам в рамках одного запроса. Вы даже можете улучшить результаты поиска для определенных индексов. видетьSearch multiple data streams and indices.
Paginate search results
По умолчанию поиск возвращает только первые 10 совпадений. Чтобы получить больше или меньше документов, см.Paginate search results.
Retrieve selected fields
Свойство hit.hits ответа поиска содержит полный документ _source для каждого попадания. Чтобы получить только подмножество _source или других полей, см.Retrieve selected fields.
Sort search results
По умолчанию результаты поиска сортируются по _score — показателю релевантности, который измеряет, насколько хорошо каждый документ соответствует запросу. Чтобы настроить расчет этих баллов, используйтеscript_scoreЗапрос. Чтобы отсортировать результаты поиска по другим значениям поля, см.Sort search results.
Run an async search
Поиск Elasticsearch предназначен для быстрого выполнения больших объемов данных, часто возвращая результаты за миллисекунды. Поэтому по умолчанию поиск синхронный. Поисковые запросы ждут полных результатов, прежде чем возвращать ответ.
Однако для кроссаfrozen indicesилиmultiple clustersпоиск, получение полных результатов может занять больше времени.
Чтобы избежать длительного ожидания, вы можете запустить асинхронный поиск.async search Позволяет немедленно получить длительные частичные результаты, а полные результаты — позже.
Search timeout
По умолчанию поисковые запросы не истекают по времени. Запрос ожидает полного результата, а затем возвращает ответ.
Хотя асинхронные поиски предназначены для длительных поисков, вы также можете использовать параметр тайм-аута, чтобы указать продолжительность ожидания завершения поиска. Если к концу этого периода ответ не будет получен, запрос завершится с ошибкой.
GET /my-index-000001/_search
{
"timeout": "2s",
"query": {
"match": {
"user.id": "kimchy"
}
}
}
Чтобы установить время ожидания по умолчанию для всего кластера для всех поисковых запросов, используйтеcluster settings APIнастроитьsearch.default_search_timeout. Эта глобальная продолжительность тайм-аута используется, если в запросе не передается параметр тайм-аута. Если время ожидания глобального поиска истекает до завершения запроса поиска, используйтеtask cancellationчтобы отменить запрос.search.default_search_timeoutЗначение по умолчанию равно -1 (без тайм-аута).
Search cancellation
ты можешь использовать этоtask management APIОтмените поисковый запрос. Elasticsearch также автоматически отменяет поисковые запросы, когда HTTP-соединение клиента закрывается. Мы рекомендуем вам настроить клиент так, чтобы он закрывал HTTP-соединение, когда поисковый запрос прерывается или истекает по тайм-ауту.
Track total hits
Часто невозможно точно подсчитать общее количество совпадений без просмотра всех совпадений, что может быть дорогостоящим для запросов, соответствующих большому количеству документов. Параметр track_total_hits позволяет контролировать, как отслеживается общее количество обращений. Значение по умолчанию — 10 000, учитывая, что обычно требуется только нижняя граница количества обращений, например, «не менее 10 000 обращений». Это означает, что запрос будет точно подсчитывать общее количество обращений, максимум до 10 000 обращений. Если вам не нужно точное количество совпадений после определенного порога, это хороший компромисс для более быстрого поиска.
Если установлено значение true, поисковый ответ всегда будет отслеживать количество совпадений, точно соответствующих запросу (например, total.relation всегда равно "eq", когда для параметра track_total_hits установлено значение true). В противном случае «отношение», возвращаемое в объекте «итого» в ответе на поиск, определяет, как следует интерпретировать «итого.значение». Значение «gte» означает, что «total.value» — это нижняя граница общего числа совпадений, соответствующих запросу, а значение «eq» означает, что «total.value» — это точное число.
GET my-index-000001/_search
{
"track_total_hits": true,
"query": {
"match" : {
"user.id" : "elkbee"
}
}
}
...возвращение:
{
"_shards": ...
"timed_out": false,
"took": 100,
"hits": {
"max_score": 1.0,
"total" : {
"value": 2048, # 与查询匹配的总点击数
"relation": "eq" # 该计数是准确的(例如,“ eq”表示相等)
},
"hits": ...
}
}
так же может бытьtrack_total_hitsУстановите целое число. Например, следующий запрос будет точно отслеживать общее количество обращений (до 100 документов), соответствующих запросу:
GET my-index-000001/_search
{
"track_total_hits": 100,
"query": {
"match": {
"user.id": "elkbee"
}
}
}
Отношение hits.total.relation в ответе будет указывать, является ли значение, возвращенное в hits.total.value, точным ("eq") или нижней границей итога ("gte").
Например, следующий ответ:
{
"_shards": ...
"timed_out": false,
"took": 30,
"hits": {
"max_score": 1.0,
"total": {
"value": 42, # 42 个符合条件的文件
"relation": "eq" # 计数是准确的(“eq”)
},
"hits": ...
}
}
...указывает, что общее количество возвращенных попаданий является точным.
Если общее количество попаданий, соответствующих запросу, превышаетtrack_total_hitsзначение, заданное в , общее количество попаданий в ответ будет указывать на то, что возвращаемое значение является нижней границей:
{
"_shards": ...
"hits": {
"max_score": 1.0,
"total": {
"value": 100, # 至少有100个符合查询条件的文档
"relation": "gte" # 这是一个下限(“gte”)
},
"hits": ...
}
}
Если вам вообще не нужно отслеживать общее количество обращений, вы можете сократить время запроса, установив для этого параметра значение false:
GET my-index-000001/_search
{
"track_total_hits": false,
"query": {
"match": {
"user.id": "elkbee"
}
}
}
...возвращение:
{
"_shards": ...
"timed_out": false,
"took": 10,
"hits": { # 总命中数未知
"max_score": 1.0,
"hits": ...
}
}
Наконец, вы можете принудительно ввести точный подсчет, установив для параметра track_total_hits значение true в запросе.
Quickly check for matching docs
Если мы просто хотим знать, есть ли какие-либо документы, соответствующие определенному запросу, мы можем установить размер равным 0, чтобы указать, что нас не интересуют результаты поиска. Вы также можете установить для terminate_after значение 1, чтобы указать, что выполнение запроса может быть прекращено, как только будет найден первый соответствующий документ (для каждого фрагмента).
GET /_search?q=user.id:elkbee&size=0&terminate_after=1
ПРИМЕЧАНИЕ. Когда на сегменте собрано достаточно обращений, функция terminate_after всегда применяется после post_filter и останавливает выполнение запроса и агрегации. Хотя количество объединенных документов может не отражать hits.total в ответе, так как агрегаты применяются до постфильтрации.
Ответ не будет содержать совпадений, так как размер равен 0 . hits.total равно 0, что означает отсутствие соответствующих документов, или больше 0, что означает, что есть по крайней мере те же документы, которые соответствуют запросу. когда он заканчивается раньше. Аналогичным образом, если запрос завершается досрочно, для флага Terminate_early в ответе будет установлено значение true .
{
"took": 3,
"timed_out": false,
"terminated_early": true,
"_shards": {
"total": 1,
"successful": 1,
"skipped" : 0,
"failed": 0
},
"hits": {
"total" : {
"value": 1,
"relation": "eq"
},
"max_score": null,
"hits": []
}
}
Время, затраченное на ответ, содержит количество миллисекунд, необходимое для обработки этого запроса, с момента получения запроса узлом до завершения всей работы, связанной с поиском, и возврата вышеуказанного JSON клиенту. Это означает, что сюда входит время, затраченное на ожидание в пуле потоков, выполнение распределенного поиска по кластеру и сбор всех результатов.
Подробности смотрите на официальном сайте:woohoo.elastic.co/expensive/en/bad…
Пожалуйста, сообщите, если перевод не разрешен, перевод не простой, пожалуйста, не присваивайте его, если вы используете его, пожалуйста, укажите источник
Alipay сделал красный конверт и попросил автора выпить кипяченой воды