Как было установлено в нашей предыдущей статье , в которой был представлен 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 , чтобы отключить возможность удаления всех индексов одной командой.