1 Обзор
Основной синтаксис запроса Elasticsearch включает в себя запрос URI и основной запрос. URI относительно легкий и быстрый, в то время как основной запрос, как запрос в формате json, может иметь много ограничений. В этой статье в основном рассказывается об использовании запросов, фильтров и агрегирования структурированных запросов.В этой статье используется версия ES 6.5.4, а ik используется китайским токенизатором.Сведения об установке и использовании см. по адресу:
Установка и использование Elasticsearch
Использование токенизатора ik в Elasticsearch
Создайте следующие индексы в ES и импортируйте данные
PUT /news
{
"aliases": {
"test.chixiao.news": {}
},
"mappings":{
"news": {
"dynamic": "false",
"properties": {
"id": {
"type": "integer"
},
"title": {
"analyzer": "ik_max_word",
"type": "text"
},
"summary": {
"analyzer": "ik_max_word",
"type": "text"
},
"author": {
"type": "keyword"
},
"publishTime": {
"type": "date"
},
"modifiedTime": {
"type": "date"
},
"createTime": {
"type": "date"
},
"docId": {
"type": "keyword"
},
"voteCount": {
"type": "integer"
},
"replyCount": {
"type": "integer"
}
}
}
},
"settings":{
"index": {
"refresh_interval": "1s",
"number_of_shards": 3,
"max_result_window": "10000000",
"mapper": {
"dynamic": "false"
},
"number_of_replicas": 1
},
"analysis": {
"normalizer": {
"lowercase": {
"type": "custom",
"char_filter": [],
"filter": [
"lowercase",
"asciifolding"
]
}
},
"analyzer": {
"1gram": {
"type": "custom",
"tokenizer": "ngram_tokenizer"
}
},
"tokenizer": {
"ngram_tokenizer": {
"type": "nGram",
"min_gram": "1",
"max_gram": "1",
"token_chars": [
"letter",
"digit"
]
}
}
}
}
}
2. Запрос
2.1 Пример запроса
Простой пример запроса выглядит следующим образом. Запрос в основном делится на запрос и фильтр. Эти два типа структур запроса находятся в запросе. Остальные метки сортировки сортируются, размер и из используются для перелистывания страниц, а _source используется для укажите, какие документы возвращаются при отзыве документов.
GET /news/_search
{
"query": {"match_all": {}},
"sort": [
{
"publishTime": {
"order": "desc"
}
}
],
"size": 2,
"from": 0,
"_source": ["title", "id", "summary"]
}
Возвращаемый результат:
{
"took" : 7,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 204,
"max_score" : null,
"hits" : [
{
"_index" : "news",
"_type" : "news",
"_id" : "228",
"_score" : null,
"_source" : {
"summary" : "据陕西高院消息,6月11日上午,西安市中级人民法院二审公开开庭宣判了陕西省首例“套路贷”涉黑案件——韩某某等人非法放贷一案,法院驳回上诉,维持原判。西安市中级人",
"id" : 228,
"title" : "陕西首例套路贷涉黑案宣判:团伙对借款人喷辣椒水"
},
"sort" : [
1560245097000
]
},
{
"_index" : "news",
"_type" : "news",
"_id" : "214",
"_score" : null,
"_source" : {
"summary" : "网易娱乐6月11日报道6月11日,有八卦媒体曝光曹云金与妻子唐菀现身天津民政局办理了离婚手续。对此,网易娱乐向曹云金经纪人求证,得到了对方独家回应:“确实是离婚",
"id" : 214,
"title" : "曹云金承认已离婚:和平离婚 有人恶意中伤心思歹毒"
},
"sort" : [
1560244657000
]
}
]
}
}
В возвращаемом результате take представляет трудоемкость, _shards представляет информацию о осколке, текущий индекс имеет 3 осколка, и все 3 осколка работают нормально, hits представляет результат попадания, total представляет общее количество попаданий, max_score представляет максимальную оценку. , hits Представляет конкретный документ попадания.
Существует два типа запросов: точная фильтрация (filter) и полнотекстовый поиск (query): точная фильтрация легко кэшируется, поэтому выполняется очень быстро.
2.2 Фильтр запроса
- term
Поиск по термину позволяет точно найти записи, соответствующие условиям, где ПОЛЕ определяет поле в индексе, а ЗНАЧЕНИЕ указывает запрашиваемое значение.
{"term": {
"FIELD": {
"value": "VALUE"
}
}
}
Например, чтобы запросить новости, источником которых является китайско-сингапурский Jingwei, вы можете использовать его следующим образом:
GET /news/_search
{
"query": {"term": {
"source": {
"value": "中新经纬"
}
}}
}
bool
Когда требуется несколько логических комбинированных запросов, можно использовать bool для группировки каждой логики. bool может содержать
{
"bool" : {
"must" : [],
"should" : [],
"must_not" : [],
}
}
must: результаты поиска должны совпадать, аналогично SQL AND
must_not: результаты поиска не должны совпадать, как в SQL NOT.
должен: результат поиска соответствует хотя бы одному, аналогично ИЛИ в SQL.
Когда нам нужно проверить новости, источником которых является широта и долгота Китая и Сингапура, а идентификатор равен 4 или 75, мы можем использовать его следующим образом: minimun_should_match используется для указания того, сколько условий должно быть соблюдено. по умолчанию — 0. В случае 0 контент должен участвовать только в подсчете очков, без обратной фильтрации.
GET /news/_search
{
"query": {
"bool": {
"must": [
{"term": {
"source": {
"value": "中新经纬"
}
}}
],
"should": [
{"term": {
"id": {
"value": "4"
}
}},
{"term": {
"id": {
"value": "75"
}
}}
],
"minimum_should_match": 1
}}
}
terms
В приведенном выше случае поиска нескольких точных значений вы можете использовать такие термины, как поиск статей с идентификатором 4 или 75.
GET /news/_search
{
"query": {"terms": {
"id": [
"4",
"75"
]
}}
}
range
Для запросов, которые должны использовать диапазон, вы можете использовать диапазон, где диапазон и термин используются в одной и той же позиции, например, поиск статей с идентификаторами от 1 до 10, где:
-
gt
:>
лучше чем -
lt
:<
меньше, чем -
gte
:>=
больше или равно -
lte
:<=
меньше или равно
GET /news/_search
{
"query": {"range": {
"id": {
"gte": 1,
"lte": 10
}
}}
}
exists
В es вы можете использовать exists для поиска документов, которые существуют или не существуют в определенном поле, например, для поиска документов с полями автора, или вы можете использовать should и must_not в bool для реализации запросов, которые не существуют или могут существовать.
GET /news/_search
{
"query": {
"exists": {"field": "author"}
}
}
2.3.Запрос запроса
В отличие от точного соответствия фильтра, запрос может выполнять полнотекстовый поиск по некоторым полям и оценивать результаты поиска. Сегментировать можно только поля типа text в es. Хотя тип ключевого слова также является строкой, его можно использовать только как перечисление, а не для сегментации, тип сегментированного текста можно указать при создании индекса.
match
Когда мы хотим найти поле, мы можем использовать совпадение, например, найти новости о спорте в статье.
GET /news/_search
{
"query": {
"exists": {"field": "author"}
}
}
В матче мы также можем указать токенизатор.Например, указываем токенизатор как ik_smart, чтобы максимально разделить входные слова на крупные частицы.В это время вспоминается документ, содержащий импортное красное вино.Если указанный токенизатор ik_max_word, будут сравниваться отдельные частицы слова Small, будут вспоминать документы, содержащие помаду и красное вино
GET /news/_search{
"query": {
"match": {
"name": {
"query": "进口红酒",
"analyzer": "ik_smart"
}
}
}
}
Для текста запроса можно разделить несколько слов. В настоящее время вы можете использовать и соединение, чтобы указать, что несколько слов попали перед тем, как они будут вызваны. Если вы используете или соединение, подобное должно, вы можете контролировать, по крайней мере, сколько слов поражено до того, как они будут отозваны. Например, для поиска новостей, содержащих спортивные новости, будет вызван следующий запрос, если документ содержит спортивные или новостные материалы.
GET /news/_search
{
"query": {
"match": {
"summary": {
"query": "体育新闻",
"operator": "or",
"minimum_should_match": 1
}
}
}
}
multi_match
Если вам нужно найти несколько полей, вы можете использовать multi_match для запроса, например, для поиска документов, содержащих ключевые слова новостей в заголовке или сводке.
GET /news/_search
{
"query": {
"multi_match": {
"query": "新闻",
"fields": ["title", "summary"]
}
}
}
2.4 Комбинированный запрос
С помощью этих полей для полнотекстового поиска и фильтрации сложные комбинированные запросы могут быть реализованы с помощью bool.
GET /news/_search
{
"query": {"bool": {
"must": [
{"match": {
"summary": {
"boost": 1,
"query": "长安"
}
}
},
{
"term": {
"source": {
"value": "中新经纬",
"boost": 2
}
}
}
],
"filter": {"bool": {
"must":[
{"term":{
"id":75
}}
]
}}
}}
}
Must, must_not, should в приведенном выше запросе bool может использовать термин, диапазон, совпадение. Все они участвуют в скоринге по умолчанию. Вы можете контролировать вес скоринга через boost. Если вы не хотите, чтобы какие-то условия запроса участвовали в скоринге, вы можете добавить фильтр в логическое значение. Поля запроса в этом фильтре не участвуют в скоринге, а содержимое запроса может быть кэшировано.
3. Агрегация
Основной формат агрегата:
GET /news/_search
{
"size": 0,
"aggs": {
"NAME": {
"AGG_TYPE": {}
}
}
}
Среди них NAME представляет имя текущей агрегации, которая может быть любой допустимой строкой, а AGG_TYPE представляет тип агрегации, которые обычно делятся на агрегацию с несколькими значениями и агрегацию с одним значением.
3.1 Пример агрегации
GET /news/_search
{
"size": 0,
"aggs": {
"sum_all": {
"sum": {
"field": "replyCount"
}
}
}
}
Приведенный выше пример означает запрос суммы replayCount в текущей библиотеке и возврат результата:
{
"took" : 8,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 204,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"sum_all" : {
"value" : 390011.0
}
}
}
Возвращаемый результат будет содержать документ попадания по умолчанию, поэтому размер должен быть указан как 0, а sum_all в результате — это имя, указанное в запросе.
Типы агрегации в Elasticsearch в основном делятся на Metrics и Bucket.
3.2.Metrics
Метрики в основном возвращают какое-то одно значение, напримерсреднее, максимальное, минимальное, сумма, статистика и т. д.эти расчеты.
max
Например, что больше всего нравится в индексе?
GET /news/_search
{
"size": 0,
"aggs": {
"max_replay": {
"max": {
"field": "replyCount"
}
}
}
}
stats
Некоторая часто используемая статистическая информация, вы можете использовать статистику, такую как просмотр общего, минимального, максимального, среднего и т. д. поля, например, просмотр основной ситуации ответов на новости в документе.
GET /news/_search
{
"size": 0,
"aggs": {
"cate": {
"stats": {
"field": "replyCount"
}
}
}
}
Возвращаемый результат:
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 204,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"cate" : {
"count" : 202,
"min" : 0.0,
"max" : 32534.0,
"avg" : 1930.7475247524753,
"sum" : 390011.0
}
}
}
3.3.Bucket
Сегменты похожи на group by в sql, Bucket используется для разделения содержимого на сегменты.
terms
После использования сегментации терминов вы можете просмотреть распределение данных, например, вы можете просмотреть, сколько источников есть в индексе, сколько статей есть в каждом источнике, а размер используется для указания категорий, которые возвращают больше всего
GET /news/_search
{
"size": 0,
"aggs": {
"myterms": {
"terms": {
"field": "source",
"size": 100
}
}
}
}
3.4 Комбинаторная кластеризация
GET /news/_search
{
"size": 0,
"aggs": {
"myterms": {
"terms": {
"field": "source",
"size": 100
},
"aggs": {
"replay": {
"terms": {
"field": "replyCount",
"size": 10
}
},
"avg_price": {
"avg": {
"field": "voteCount"
}
}
}
}
}
}
Вышеприведенный код сначала группирует исходный код, группирует replayCount в каждом типе источника и вычисляет среднее голосование в каждом исходном классе.
Один из возвращенных результатов выглядит следующим образом
{
"key" : "中国新闻网",
"doc_count" : 16,
"avg_price" : {
"value" : 1195.0
},
"replay" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 4,
"buckets" : [
{
"key" : 0,
"doc_count" : 3
},
{
"key" : 1,
"doc_count" : 1
},
{
"key" : 5,
"doc_count" : 1
},
{
"key" : 32,
"doc_count" : 1
},
{
"key" : 97,
"doc_count" : 1
},
{
"key" : 106,
"doc_count" : 1
},
{
"key" : 133,
"doc_count" : 1
},
{
"key" : 155,
"doc_count" : 1
},
{
"key" : 156,
"doc_count" : 1
},
{
"key" : 248,
"doc_count" : 1
}
]
}
}
4. Сочетание запроса и агрегации
С помощью запроса и агрегации мы можем агрегировать результаты запроса. Например, если я хочу увидеть исходные веб-сайты, содержащие спортивные новости, в сводке, я могу сделать запрос следующим образом.
GET /news/_search
{
"size": 0,
"query": {"bool": {"must": [
{"match": {
"summary": "体育"
}}
]}},
"aggs": {
"cate": {
"terms": {
"field": "source"
}
}
}
}
5. Резюме
Синтаксис запросов Elasticsearch относительно сложен и разнообразен.Здесь перечислены только некоторые распространенные запросы и агрегации.Подробности можно найти в официальных документах и авторитетных руководствах.Официальные руководства написаны на китайском языке и их удобнее читать, но они 2.x контент и официальные документы.Есть соответствующая версия контента, контент относительно новый, рекомендуется читать официальную документацию.
Полное руководство по Elasticsearch (китайский)
Официальная документация Elasticsearch6.5 (на английском языке)