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