Я пиво и острые полоски.
Делать добрые дела, не прося вознаграждения.
Официальный предоставляет нам API для работы с Elasticsearch на нескольких языках, которыми можно легко управлять в проекте. Научитесь работать с Elasticsearch с собственными запросами, упростите обслуживание базы данных и ускорьте обучение использованию API на разных языках.
Этот блог использует кибану для инициирования запросов, а кибану можно использовать для просмотра сочетаний клавиш.
индексная операция
создать индекс
Создайте индекс, используяPUT
Запрос, за которым следует имя индекса, поскольку тип 7.x по умолчанию —_doc
, поэтому вам не нужно идти в ногу с типом. В то же время, как простой запрос PUT, тело запроса JSON может быть добавлено для сложного создания.
PUT /user
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 2
}
},
"mappings": {
"properties": {
"name": { "type": "text" },
"age": {"type": "short"},
"city":{"type": "keyword"}
}
}
}
создать индексuser
, вы можете передать параметрsetting
Установите количество осколков и реплик черезnumber_of_shards
Установите в общей сложности 3 осколка, черезnumber_of_replicas
Установите 2 реплики для каждого шарда, если не указано по умолчанию, оба параметра равны 1. пройти черезmappings
Определяет тип вставки каждого Filed в документе. Кроме того, вы также можете установитьaliases
поле, создайте псевдоним для индекса, чтобы можно было не только получить доступ к индексу через псевдоним, но также можно было определить условия запроса, можно было указать сегменты запроса и т. д.Для получения подробной информации см..
падение индекса
Чтобы удалить индекс, используйте запрос DELETE.
DELETE /user
индекс просмотра
Для просмотра указателя используйтеGET
Запрос, вы можете просмотреть параметры, установленные индексом.
После удаления я снова добавил индекс, и никаких настроек не было, поэтому и шарды, и реплики были 1.
Вы также можете просмотреть определенный параметр, добавив параметр после индекса, например:
GET /user/_settings
GET /user/_mappings
GET /user/_aliases
Изменить настройки раздела индекса
в состоянии пройтиPUT
Запрос на изменение настроек части индекса. Например, можно изменить количество реплик шардов, но нельзя изменить количество шардов таким образом.
PUT /user/_settings
{
"number_of_replicas": 3
}
Копию осколка можно изменить с помощью вышеуказанного запроса.
манипулирование документами
Создайте индекс и посмотрите на добавление, удаление и изменение документов.Это наиболее часто используемое место в повседневной работе.
Вставить документ
Добавить использование документаPUT
,POST
просить.
PUT /<target>/_doc/<_id>
POST /<target>/_doc/
PUT /<target>/_create/<_id>
POST /<target>/_create/<_id>
target
имя индекса,_doc
является типом по умолчанию. Из первых двух запросов видно, что id может быть указан сам или автоматически сгенерирован ES._create
Гарантируется вставка только в том случае, если документ не существует, в то время как_doc
Может также использоваться для обновления документов.
POST /user/_doc/1
{
"name":"pjjlt",
"age":26,
"city":"sjz"
}
обновить документацию
Для обновления документации вы можете использоватьPUT
илиPOST
Ключевые слова запроса, полное обновление.
POST /user/_doc/1
{
"name":"pjjlt",
"age":3,
"city":"sjz"
}
также через_update
Команда частичного обновления, так называемое частичное обновление, означает, что нет необходимости добавлять все поля в тело запроса, добавляются только те поля, которые необходимо изменить, а остальные поля остаются без изменений. Полное обновление заменяет весь документ.
POST /user/_update/1
{
"doc":{
"age": 26
}
}
Кроме того, его можно модифицировать скриптом, например, все существующиеage
Документ для поля, значение которого изменено на 5 лет.
POST /user/_update_by_query
{
"script": {
"source": "ctx._source['age']=5"
},
"query": {
"bool": {
"must": [
{
"exists": {
"field": "age"
}
}
]
}
}
}
такжеupdate
а также_update_by_query
Поля также могут быть измененыFiled
, например, изменить имя на имя1, этот контент используется меньше, если вам интересно, обратитесь к официальной документации.
удалить документ
Для удаления документов можно использоватьDELEETE
Запросить, удалить документ с указанным id, также можно использовать_delete_by_query
, который удаляет документы при заданных условиях.
DELETE /user/_doc/1
POST /user/_delete_by_query
{
"query": {
"match": {
"name": "pjjlt"
}
}
}
Найти документацию
Поиск документов — самая захватывающая часть операций ES, здесь представлены только простые запросы, а сложные запросы и агрегированные запросы будут введены позже.
Запросить документ по id.
GET /user/_doc/1
Найти все документы в индексе
GET /user/_search?pretty
pretty
Параметры будут играть роль только в браузере, отформатированы и возвращены в json. Приведенная выше команда по умолчанию возвращает 10 элементов данных. Если вы хотите вернуть больше данных, вы можете добавитьsize
поле.
GET /user/_search?pretty&size=20
Видно, что часть данных находится вhits
Внутри клиент elasticsearch, предоставляемый Spring, будет иметь соответствующие классы сущностей, которые очень удобно использовать в проекте. Давайте посмотрим на значение этих частей.
элемент | имея в виду |
---|---|
took | сколько времени занимает выполнение запроса |
time_out | Время запроса истекло |
_shards | Сколько осколков было обыскано и сколько из них было успешным Сколько пропусков, сколько неудач |
hits.total | Сколько всего данных |
hits._max_score | Среди запрошенных документов оценка наиболее релевантного документа |
hits.hits._source | запрошенные данные |
hits.hits.id | первичный ключ документа |
Массовые операции
Пакетная операция означает, что пакет команд выполняется одновременно (сокращение операций ввода-вывода), и эти команды не обязательно относятся к одному и тому же типу.
использовать_bulk
Команда может выполнять пакетное добавление, удаление и изменение документов.
POST _bulk
{ "update" : { "_index" : "user", "_id" : "1" } }
{ "doc" : {"age" : 18} }
{ "create" : { "_index" : "user", "_id" : "2" } }
{ "name" : "小明","age":32,"city":"beijing" }
{ "create" : { "_index" : "user", "_id" : "3" } }
{ "name" : "小红","age":21,"city":"sjz" }
{ "create" : { "_index" : "user", "_id" : "4" } }
{ "name" : "mark","age":22,"city":"tianjin" }
{ "delete" : { "_index" : "user", "_id" : "4" } }
Приведенная выше команда обновляет возраст документа с идентификатором 1, добавляет документы с идентификаторами 2, 3 и 4 и удаляет документ с идентификатором 4.
Вышеупомянутые команды нелегко увидеть, когда они сложены вместе, поэтому для удобства читателей ниже они написаны отдельно.
Массовое добавление
POST _bulk
{ "create" : { "_index" : "user", "_id" : "2" } }
{ "name" : "小明","age":32,"city":"beijing" }
{ "create" : { "_index" : "user", "_id" : "3" } }
{ "name" : "小红","age":21,"city":"sjz" }
{ "index" : { "_index" : "user", "_id" : "4" } }
{ "name" : "mark","age":22,"city":"tianjin" }
create
Команда заключается в том, чтобы вставить, только если документ не существует,index
Он рассудит, что если он существует, то будет обновлен, а если не существует, то будет вставлен.
Массовое обновление
POST _bulk
{ "update" : { "_index" : "user", "_id" : "1" } }
{ "doc" : {"age" : 18} }
{ "update" : { "_index" : "user", "_id" : "2" } }
{ "doc" : {"age" : 20} }
Как и при добавлении,update
Следующая строка команды должна следовать за данными data.
пакетное удаление
POST _bulk
{ "delete" : { "_index" : "user", "_id" : "3" } }
{ "delete" : { "_index" : "user", "_id" : "4" } }
Массовый поиск
пакетный поиск, использование_mget
Ключевое слово, массовый поиск также имеет сокращенную форму, если оно не охватывает индекс.
GET /_mget
{
"docs": [
{
"_index": "user",
"_id": "1"
},
{
"_index": "user",
"_id": "2"
}
]
}
# 还可以简写形式
POST /user/_mget
{
"ids": [
"1",
"2",
"3"
]
}
DSL-запрос
Elasticsearch предоставляет полный DSL запросов на основе JSON (язык домена) для определения запросов. DSL запроса можно рассматривать как AST (абстрактное синтаксическое дерево) запроса, состоящее из двух типов предложений:Leaf query clauses(пункт запроса листа) иCompound query clauses(предложение составного запроса)
Вышеупомянутое взято с официального сайта, Короче говоря, DSL должен помещать условия запроса в JSON для запроса.
Leaf query clausesНайдите конкретное значение в определенном поле, например.match
,term
,range
запрос и т.д.
Compound query clausesОбъедините листовые предложения запроса с другими соответствующими предложениями запроса, например.bool
запрос и т.д.
match
match – это стандартный запрос. При запросе текста текст сначала будет сегментирован. При запросе точного значения ищется заданное значение, например число, дата, логическое значение или строка not_analyzed.
GET /user/_search
{
"query": {
"match": {
"name":"小明"
}
}
}
Вышеупомянутая операция сначала разделит «Сяо Мин» на «Сяо» и «Мин» (конечно, это зависит от вашего токенизатора), а затем перейдет ко всем документам, чтобы найти совпадающие документы, и вернет их в соответствии со степенью релевантности. .
match_phrase
match_phrase сохранит пробелы, а match будет игнорировать пробелы.
GET /user/_search
{
"query": {
"match_phrase": {
"name":"小 明"
}
}
}
Обратите внимание, что слово «сегментация» представляет собой пробел, который дает предыдущий элемент, например, за приведенной выше строкой «молекула» следует «маленький», «мин».
multi_match
Запрос с несколькими полями, условие запроса, чтобы увидеть, есть ли во всех нескольких полях совпадающие поля. Позже мы также можем использовать
should
более гибкий.
GET /user/_search
{
"query": {
"multi_match": {
"query": "哈哈",
"fields": [ "name","city" ]
}
}
}
match_all
соответствует всем и может установить
_score
,дефолт_score
Это 1, Латиао Цзюнь думает, что здесь нет расчета._score
, поэтому скорость будет намного выше.
GET /user/_search
{
"query": {
"match_all": { "boost" : 1.2 }
}
}
boost
Параметр можно не указывать, по умолчанию 1.
term
Термин — это точное совпадение, в основном используемое для точного поиска, такого как числа, идентификаторы, адреса электронной почты и т. д.
GET /user/_search
{
"query": {
"term": {
"age": 18
}
}
}
terms
terms — это запрос термина с несколькими условиями, и несколько параметров могут быть переданы в виде массива.
GET /user/_search
{
"query": {
"terms": {
"age":[18,21]
}
}
}
wildcard
Подстановочные знаки легко понять, взглянув на пример. Подстановочные знаки могут решить проблему, связанную с несоответствием сегментации слов. Например, «ха-ха» может соответствовать «* а».
GET /user/_search
{
"query": {
"wildcard": {
"name":"*a"
}
}
}
exists
Проверьте, имеет ли документ определенный атрибут, и вернитесь, чтобы включить его
Filed
документация.
GET /user/_search
{
"query": {
"exists": {
"field": "name"
}
}
}
fuzzy
Возвращает совпадения, которые совпадают или похожи на запрос.
GET /user/_search
{
"query": {
"fuzzy": {
"name":"mjjlt"
}
}
}
Критерии поискаmjjlt
, вы можете искать имя какpjjlt
документация. Часто ли эта операция встречается в Baidu?
ids
Запрос с несколькими идентификаторами, этот идентификатор является идентификатором первичного ключа, то есть вы указываете или автоматически генерируете его.
GET /user/_search
{
"query": {
"ids": {
"values":[1,2,3]
}
}
}
prefix
совпадение префикса
GET /user/_search
{
"query": {
"prefix": {
"name":"pj"
}
}
}
range
Ассортимент совпадает. Параметры могут бытьgt(больше, чем),gte(больше или равно),lt(меньше, чем),lte(меньше или равно)
GET /user/_search
{
"query": {
"range": {
"age":{
"gt":1,
"lt":30
}
}
}
}
regexp
Обычный матч. value — регулярное выражение, flags — соответствующий формат, значение по умолчанию — ALL, и все они включены. больше форматовпожалуйста ткните
GET /user/_search
{
"query": {
"regexp": {
"name":{
"value": "p.*t",
"flags": "ALL"
}
}
}
}
bool
bool можно использовать для объединения других подзапросов. Обычно включаемые подзапросы включают: must, filter, should, must_not.
must
must
Внутреннее условие должно содержать, внутреннее условиеand
Отношение. Например, просмотрите все пользовательские документы, имя которых содержит слово «маленький» и возраст которых составляет 32 года.
GET /user/_search
{
"query": {
"bool" : {
"must": [
{"term" : { "name" : "小" }},
{"term" : { "age" : 32 }}
]
}
}
}
filter
filter
Отфильтрован ли документ по каким-то условиям, это единственное из четырех ключевых словНезависимо от релевантности, _score не будет рассчитываться, часто используемые фильтры будут генерировать кеш.
GET /user/_search
{
"query": {
"bool" : {
"filter": {
"term" : { "name" : "小" }
}
}
}
}
Сравнивая два рисунка, видно, что фильтр не считает _score, и скорость поиска выше.
must_not
это иmust
И наоборот, поле в документе не должно содержать значение, эквивалентное «не».
should
should
можно рассматривать какor
Например, следующее имя запроса содержит «маленький» или пользователей, возраст которых составляет 18 лет.
GET /user/_search
{
"query": {
"bool" : {
"should": [
{"term" : { "name" : "小" }},
{"term" : { "age" : 18 }}
]
}
}
}
Совокупный запрос
В дополнение к функции полнотекстового поиска Elasticsearch предоставляет функции статистического анализа данных Elasticsearch. Вы можете запросить максимальное и минимальное значения группы данных,группировкаЗапросите некоторые данные.
- Метрика: тип анализа метрик, например, вычисление максимального значения, минимального значения, среднего значения и т. д. (операция выполнения совокупного анализа документов в корзине).
- Bucket: тип сегмента, аналогичный синтаксису GROUP BY в SQL (набор документов, удовлетворяющих определенным условиям).
- Конвейер: Тип анализа конвейера, основанный на результатах анализа агрегации предыдущего уровня для текущего анализа.
Метрические данные
Общие математические операции
Обычно используемые математические операции здесь
min
(минимум),max
(максимум),sum
(а также),avg
(средний). Обратите внимание, что эти операции могут вывести только один результат анализа. Использование аналогично.
GET /user/_search
{
"aggs" : {
"avg_user_age" :
{
"avg" : { "field" : "age" }
}
}
}
Приведенный выше пример запрашивает средний возраст всех пользователей, возвращает все документы и агрегированные результаты запроса.aggs
ключевое слово агрегированного запроса,avg_user_age
Это имя запроса, которое может быть определено пользователем.
cardinality
Вычислить номер поля после дедупликации
GET /user/_search
{
"aggs" : {
"avg_user" :
{
"cardinality" : { "field" : "age" }
}
}
}
Можно подсчитать, что количество документов с разным возрастом во всех документах.
percentiles
Накапливает пропорцию количества документов, соответствующих каждому значению значения указанного поля, от малого к большому, и возвращает значение, соответствующее указанной пропорции.
Процент статистики по умолчанию: **[ 1, 5, 25, 50, 75, 95, 99]**
GET /user/_search
{
"aggs" : {
"avg_user" :
{
"percentiles": { "field" : "age" }
}
}
}
# 返回值(省略文档部分,只分析结果部分)
"aggregations" : {
"avg_user" : {
"values" : {
"1.0" : 12.0,
"5.0" : 12.0,
"25.0" : 20.25,
"50.0" : 29.0,
"75.0" : 57.75,
"95.0" : 123.0,
"99.0" : 123.0
}
}
}
Видно, что верхний 1% пользователей моложе 12 лет, 5% пользователей моложе 12 лет, 25% пользователей моложе 20,25 лет и 50% пользователей моложе 29 лет. Старый. . .
percentile_ranks
процентили — найти поле документа в процентах, а процентили_ранги — найти процент поля в данном документе.
GET /user/_search
{
"aggs" : {
"avg_user" :
{
"percentile_ranks":
{
"field" : "age",
"values" : [18, 30]
}
}
}
}
# 返回值(省略文档部分,只分析结果部分)
"aggregations" : {
"avg_user" : {
"values" : {
"18.0" : 18.51851851851852,
"30.0" : 54.44444444444445
}
}
}
Видно, что 18,52% пользователей моложе или равны 18 годам, а 54,4% пользователей моложе или равны 30 годам.
top_hits
top_hits может получить первые n документов при определенных условиях.
GET /user/_search
{
"aggs": {
"avg_user" : {
"top_hits": {
"sort": [
{
"age": {
"order": "asc"
}
}
],
"size": 1
}
}
},
"size": 0
}
Возьмем самого младшего возраста.
Ведро
Подобно концепции группировки.
terms
Возвращает количество документов в группе в соответствии с заданной группировкой.
GET /user/_search
{
"aggs" : {
"avg_user" :
{
"terms": {
"field": "city"
}
}
}
}
Вышеупомянутое сгруппировано по городам, чтобы увидеть, сколько пользователей в каждом городе.
ranges
группировать по интервалу
GET /user/_search
{
"aggs": {
"price_ranges": {
"range": {
"field": "age",
"ranges": [
{ "to": 20 },
{ "from": 20, "to": 30 },
{ "from": 30 }
]
}
}
}
}
Вы можете просмотреть количество пользователей для каждой возрастной группы.
Также есть несколько очень интересных инструкций, например [IP range], которые можно сгруппировать по интервалу ip сегмента, который будет использоваться в дальнейшем, надеюсь текст можно обновить без абзацев...