Статьи

Основные операции ElasticSearch

Как было установлено в нашей предыдущей статье , в которой был представлен ElasticSearch, ElasticSearch управляется RESTful API. Почти каждое действие, выполненное с помощью RESTful API, может быть выполнено с использованием JSON через HTTP. В этом гипотетическом примере выполняются базовые операции ElasticSearch с использованием cURL (клиентской библиотеки запросов URL) для индексации статей, опубликованных на kodcu.com, по названию, содержимому, дате публикации, тегам и информации об авторе.

Создание индекса

API Создать индекс предоставляет возможность создания индекса. ElasticSearch также поддерживает несколько индексов и выполнение транзакций между индексами. Пользовательские настройки для каждого созданного индекса также могут быть предоставлены. 

hakdogan:~ hakdogan$ curl -XPUT 'http://localhost:9200/kodcucom/' -d '
> index:
> number_of_shards: 2
> number_of_replicas: 1
> '

С помощью этой команды мы создали индекс по имени kodcucom, указав количество шардов и реплик. 

Осколок в ElasticSearch — это единственный экземпляр Lucene. Управляется автоматически. Индекс имеет пять основных сегментов по умолчанию. Вы можете указать номер шарда по умолчанию в файле config /asticsearch.yml. 

Как мы видели в примере, это число можно изменить, особенно в отношении созданного индекса. Количество первичных сегментов нельзя изменить после создания индекса. ElasticSearch распределяет фрагменты между всеми узлами в кластере, а в случае сбоя узла или добавления нового узла автоматически перемещает фрагменты.

Как указывалось ранее, ElasticSearch может анализировать отправленную запись, а затем автоматически создавать индекс и вводить информацию со стандартными настройками.

hakdogan:~ hakdogan$ curl -XPUT localhost:9200/kodcucom/article/1 -d '{
> title: "Java API for JSON Processing - Stream-based JSON Produce and Consume",
> content: "Java API for JSON Processing (JSON-P) standard under the umbrella of the Java EE 7 in the JSR-353 specification is an enterprise java technology.",
> postDate: "2013-08-06T12:00:00",
> tags: ["Java"],
> author: "Rahman Usta"
> }'
{"ok":true,"_index":"kodcucom","_type":"article","_id":"1","_version":1}

С помощью приведенной выше команды индекс с именем kodcucom и тип с именем article создаются со стандартными настройками, а запись (JSONdocument) со значением идентификатора 1 сохраняется в ElasticSearch.

Получение документа

API Get ElasticSearch позволяет вам получить документ с указанным значением ID. 

hakdogan:~ hakdogan$ curl -XGET localhost:9200/kodcucom/article/1?pretty=true
{
  "_index" : "kodcucom",
  "_type" : "article",
  "_id" : "1",
  "_version" : 1,
  "exists" : true, "_source" : {
title: "Java API for JSON Processing - Stream-based JSON Produce and Consume",
content: "Java API for JSON Processing (JSON-P) standard under the umbrella of the Java EE 7 in the JSR-353 specification is an enterprise java technology.",
postDate: "2013-08-06T12:00:00",
tags: ["Java"],
author: "Rahman Usta"}
}

По умолчанию API Get работает в режиме реального времени и не влияет на частоту обновления индекса. Вы можете указать поля, которые будут извлечены во время получения документа. Возвращение набора полей может быть достигнуто путем передачи параметра.

hakdogan:~ hakdogan$ curl -XGET localhost:9200/kodcucom/article/1?fields=title,author
{
"_index":"kodcucom",
"_type":"article",
"_id":"1",
"_version":1,
"exists":true,
"fields": {
"author":"Rahman Usta",
"title":"Java API for JSON Processing - Stream-based JSON Produce and Consume"}
}

Получение нескольких документов

Multi Get API позволяет получать несколько документов на основе индекса, типа (необязательно) и идентификатора. Ответ включает в себя массив документов со всеми выбранными документами. 

hakdogan:~ hakdogan$ curl localhost:9200/_mget -d '{
> docs: [
>          {
>           _index: "kodcucom",
>           _type: "article",
>          _id: "1"
>         },
>        {
>        _index: "kodcucom",
>        _type: "article",
>        _id: "2"
>       }
>            ]
> }'
{
   "docs": [
                {"_index":"kodcucom",
                 "_type":"article",
                 "_id":"1",
                 "_version":1,
                 "exists":true, 
                 "_source" : {
                 title: "Java API for JSON Processing - Stream-based JSON Produce and Consume",
                 content: "Java API for JSON Processing (JSON-P) standard under the umbrella of the Java EE 7 in the JSR-353 specification is an enterprise java technology.",
                 postDate: "2013-08-06T12:00:00",
                 tags: ["Java"],
                 author: "Rahman Usta"}
},
                {
                 "_index":"kodcucom",
                 "_type":"article",
                 "_id":"2",
                 "_version":1,
                 "exists":true, 
                 "_source" : {
                 title: "Core ElasticSearch Operations",
                 content: "Elasticsearch is RESTful API driven",
                 postDate: "2013-08-13T09:00:00",
                 tags: ["elasticsearch, big-data"],
                 author: "Hüseyin Akdoğan"}
}
]
}

Конечная точка Mget также может использоваться вместе с информацией об индексе и типе. 

hakdogan:~ hakdogan$ curl localhost:9200/kodcucom/_mget -d '{
> docs: [
>          {
>           _type: "article",
>          _id: "1"
>         },
>        {
>        _type: "article",
>        _id: "2"
>       }
>        ]
> }'

hakdogan:~ hakdogan$ curl localhost:9200/kodcucom/article/_mget -d '{
> docs: [
>          {
>          _id: "1"
>         },
>        {
>        _id: "2"
>       }
>        ]
> }'

Для простого запроса можно использовать элемент ids

hakdogan:~ hakdogan$ curl localhost:9200/kodcucom/article/_mget -d '{
> ids: ["1", "2"]
> }'

Давайте посмотрим, как получить определенные поля раз и навсегда. 

hakdogan:~ hakdogan$ curl localhost:9200/_mget -d '{
> docs: [
>           {
>            _index: "kodcucom",
>            _type: "article",
>            _id: "1",
>            fields: ["title", "author"]
>          },
>         {
>           _index: "kodcucom",
>           _type: "article",
>           _id: "2",
>          fields: ["postDate", "tags"]
>         }
>        ]
> }'

Поиск

API поиска позволяет выполнить поисковый запрос, а затем получить результаты, соответствующие запросу. Поисковый запрос может быть выполнен с использованием простой строки запроса в качестве параметра или с использованием тела запроса. Ниже вы можете увидеть пример каждого использования ( пример, который использует тело запроса, также содержит запрос диапазона ):

hakdogan:~ hakdogan$ curl -XGET localhost:9200/kodcucom/article/_search?fields=title,author

hakdogan:~ hakdogan$ curl -XGET localhost:9200/kodcucom/article/_search -d '{
> query: {range: {postDate: {from: "2013-01-01", to: "2013-08-13"}}}
> }'

обновление

API обновления ElasticSearch поддерживает обновление путем обновления скрипта и передачи частичного документа, который объединится с существующим документом. ElasticSearch использует управление версиями ( каждый индексируемый документ в ElasticSearch проверяется ), чтобы быть уверенным в процедуре обновления. Обновление означает полную переиндексацию документа. 

hakdogan:~ hakdogan$ curl -XPOST localhost:9200/kodcucom/article/1/_update -d '{
> script: "ctx._source.tags += tag",
> params: {
> tag: "json-p"}
> }'
{"ok":true,"_index":"kodcucom","_type":"article","_id":"1","_version":2}

Выше вы видите обновление скрипта. Модуль сценариев ElasticSearch позволяет использовать сценарии для оценки пользовательских выражений. Модуль сценариев использует MVEL по умолчанию. С помощью плагина Lang можно также запускать сценарии на разных языках , таких как JavaScript, Groovy и Python.

Вернемся к приведенной выше команде снова. ctx — это контекст скрипта. С контекстом сценария , теги поле обновляется через _source поле документа. Скрипт также может использовать параметр. Обратите внимание на использование параметров здесь. Значение устанавливается для параметра tag в части params

Вы можете добавить новое поле в документ путем обновления скрипта. 

hakdogan:~ hakdogan$ curl -XPOST localhost:9200/kodcucom/article/1/_update -d '{
> script: "ctx._source.temporaryField = \"temporary text\""
> }'
{"ok":true,"_index":"kodcucom","_type":"article","_id":"1","_version":3}

Вы также можете удалить.

hakdogan:~ hakdogan$ curl -XPOST localhost:9200/kodcucom/article/1/_update -d '{
> script: "ctx._source.remove(\"temporaryField\")"
> }'
{"ok":true,"_index":"kodcucom","_type":"article","_id":"1","_version":4}

Обратите внимание на информацию о версии в произведенном выводе. API обновления поддерживает передачу частичного документа, который объединится с существующим документом. 

hakdogan:~ hakdogan$ curl -XPOST localhost:9200/kodcucom/article/1/_update -d '{
doc: {                                                                        
author: "RAHMAN USTA"                                                                                                                                        
}                               
}'
{"ok":true,"_index":"kodcucom","_type":"article","_id":"1","_version":5}

Точка, которую следует отметить; если указан документ и скрипт , то документ игнорируется . ElasticSearch также обеспечивает поддержку предварительно загруженных скриптов. 

Удаление

Прежде чем исследовать ElasticSearch Delete API, я хочу указать, что можно удалить документ ( запись ) со сценарием в зависимости от значения, которое имеет поле. 

hakdogan:~ hakdogan$ curl -XPOST localhost:9200/kodcucom/article/1/_update -d '{
script: "ctx._source.tags.contains(tag) ? ctx.op = \"delete\" : ctx.op = \"none\"",
params: { tag: "Java"}
}'
{"ok":true,"_index":"kodcucom","_type":"article","_id":"1","_version":6}hakdogan:~ hakdogan$ 
hakdogan:~ hakdogan$ curl -XGET localhost:9200/kodcucom/article/1?pretty=true
{
  "_index" : "kodcucom",
  "_type" : "article",
  "_id" : "1",
  "exists" : false
}

API-интерфейс Delete позволяет удалять документ, для которого указано значение идентификатора. 

hakdogan:~ hakdogan$ curl -XDELETE localhost:9200/kodcucom/article/1
{"ok":true,"found":true,"_index":"kodcucom","_type":"article","_id":"1","_version":2}

API Удалить индекс позволяет удалить индекс. 

hakdogan:~ hakdogan$ curl -XDELETE localhost:9200/kodcucom

По умолчанию API удаления индекса можно применять к нескольким индексам. 

hakdogan:~ hakdogan$ curl -XDELETE localhost:9200

Для action.disable_delete_all_indices должно быть установлено значение true , чтобы отключить возможность удаления всех индексов одной командой.