Tehnografi.com - Технологические новости, обзоры и советы
[adinserter block="67"]

Elasticsearch DSL для поиска и ранжирования информации

Следующая статья поможет вам: Elasticsearch DSL для поиска и ранжирования информации

В современных информационных системах объем данных значительно увеличивается каждый час. Каждый пользователь вносит в информационные системы новую информацию, а это, в свою очередь, также увеличивает размер резервных копий, размер журналов, дублирование транзакций и так далее. Для эффективного поиска информации необходимо использовать соответствующие средства, которые эффективно решат поставленную задачу. Причем объем информации может быть настолько велик, что для работы с задачами поиска, сортировки и сопоставления информации необходимо использовать многопоточные вычисления. В этом вам поможет замечательный инструмент Elasticsearch. Для работы с этой системой также можно использовать библиотеку Python Elasticsearch DSL. В этом блоге мы поговорим об основных возможностях поиска информации с помощью этих инструментов.

Что такое эластичный поиск?

Elasticsearch — бесплатный поисковый сервер. Он предоставляет распределенную многопользовательскую полнотекстовую поисковую систему с веб-интерфейсом HTTP и поддержкой бесшовных документов JSON. Первая версия Elasticsearch была запущена в феврале 2010 года. Elasticsearch можно использовать для индексации и поиска документов любого типа. Он обеспечивает расширенный поиск и поддерживает поиск практически в реальном времени. Elasticsearch имеет возможность распределять индексы, которые могут быть разделены на сегменты, и каждый сегмент может иметь ноль или более реплик. Каждый узел содержит один или несколько сегментов и действует как координатор для делегирования операций нужному сегменту. Балансировка и маршрутизация выполняются автоматически.

В пользу системы Elasticsearch можно подтвердить следующее:

  • В Elasticsearch вы можете выполнять и комбинировать различные виды поиска независимо от типа данных. Информация может включать структурированные, неструктурированные, географические, метрические и другие типы данных.
  • Поддерживаются библиотеки для разных языков программирования и запросы HTTP API.
  • Запрос GET может быстро получить данные в нужном виде.
  • Elasticsearch может эффективно анализировать миллиарды записей за считанные секунды.
  • Система предоставляет агрегаты, чтобы помочь вам исследовать тенденции и закономерности в ваших данных.

Вкратце, Elasticsearch обеспечивает масштабируемый поиск и поддержку многопоточности. Индексы поиска можно разделить на сегменты, каждый сегмент может иметь несколько реплик, каждый узел может содержать несколько сегментов, при этом каждый узел выступает в качестве координатора для делегирования операций правильному сегменту, ребалансировка и маршрутизация выполняются автоматически. Связанные данные часто хранятся в одном и том же индексе, состоящем из одного или нескольких основных сегментов и, возможно, нескольких реплик.

Установка эластичного поиска

Установка системы Elasticsearch не очень сложна. Если, например, вы хотите попробовать установить систему на MacOS, вы должны использовать brew. Другие системы имеют соответствующие инструменты установки, которые вы можете увидеть как часть документации на Сайт Elasticsearch.

brew tap elastic/tap

Установка займет некоторое время:

==> New Formulae
archey4             dory                llvm@11             marcli              organize-tool       stp                 zinit
conftest            [email protected]           lychee              minisat             revive              webhook
csvtk               lefthook            macchina            mr2                 six                 xplr
==> Updated Formulae
Updated 680 formulae.
==> Renamed Formulae
fcct -> butane

==> Tapping elastic/tap
Cloning into '/usr/local/Homebrew/Library/Taps/elastic/homebrew-tap'...
remote: Enumerating objects: 870, done.
remote: Counting objects: 100% (111/111), done.
remote: Compressing objects: 100% (84/84), done.
remote: Total 870 (delta 63), reused 55 (delta 26), pack-reused 759
Receiving objects: 100% (870/870), 202.89 KiB | 490.00 KiB/s, done.
Resolving deltas: 100% (649/649), done.
Tapped 17 formulae (50 files, 319.4KB).

Следующая команда установит полный набор Elastisearch.

brew install elastic/tap/elasticsearch-full

Затем добавьте в свой

.bash_profile

следующие строки:

ES_HOME=/usr/local/var/homebrew/linked/elasticsearch-full
export ES_HOME

Это поможет вам запустить Elasticsearch из каталога установки на вашем компьютере.

Запуск и тестирование установки Elasticsearch

Запустите elasticsearch и перезапустите при входе в систему:

brew services start elasticsearch

Или, если вам не нужна фоновая служба, вы можете просто запустить:

elasticsearch

Чтобы протестировать тип установки elasticsearch:

curl localhost:9200

Это приведет к следующему результату:

{
  "name" : "MacBook-Pro-K-2",
  "cluster_name" : "elasticsearch_konst1970",
  "cluster_uuid" : "O2BwRmCCQ8amY3CiZa7Bpg",
  "version" : {
    "number" : "7.12.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "78722783c38caa25a70982b5b042074cde5d3b3a",
    "build_date" : "2021-03-18T06:17:15.410153305Z",
    "build_snapshot" : false,
    "lucene_version" : "8.8.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

Это означает, что Elasticsearch версии 7.12.0 запущен и работает.

Использование Python и Elasticsearch

Есть много способов использовать Elasticsearch с языком программирования Python. Например, вы можете писать HTTP-запросы к Elasticsearch API с помощью своей любимой сетевой библиотеки Python. Или вы можете использовать официальную низкоуровневую библиотеку Python Elasticsearch, известную как эластичный поиск.

На более высоком уровне можно использовать библиотеку Elasticsearch DSL для Python для создания более компактного и эффективного кода. Как указано на их веб-сайте: «Elasticsearch DSL — это библиотека высокого уровня, целью которой является помощь в написании и выполнении запросов к Elasticsearch. Он построен поверх официального низкоуровневого клиента (elasticsearch-py). Он обеспечивает более удобный и идиоматический способ написания запросов и управления ими. Он остается близким к Elasticsearch JSON DSL, отражая его терминологию и структуру. Он предоставляет весь диапазон DSL из Python либо напрямую, используя определенные классы, либо выражения, подобные наборам запросов. Он также предоставляет дополнительную оболочку для работы с документами как с объектами Python: определение сопоставлений, извлечение и сохранение документов, упаковка данных документа в пользовательские классы».

Установить эластичный поиск и elasticsearch_dsl библиотеки на вашем компьютере, пожалуйста, используйте точка. Учтите, что поисковая система Elasticsearch уже установлена ​​в вашей системе.

pip install elasticsearch
pip install elasticsearch_dsl

Чтобы попробовать Elasticsearch с Python, запустите следующий код:

from elasticsearch import Elasticsearch

es = Elasticsearch([{'host': 'localhost', 'port': 9200}])

print (es)

Это будет означать, что Elasticsearch работает правильно:

<Elasticsearch([{'host': 'localhost', 'port': 9200}])>

Обратите внимание, если вы хотите удалить записи из Elasticsearch, необходимо выполнить дополнительные настройки. Чтобы удалить информацию из системы Elasticsearch, вы можете использовать следующий запрос конфигурации:

curl -XPUT -H "Content-Type: application/json" 

Эта команда предоставит следующий вывод, указывающий на успешную работу системы.

http://127.0.01:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

Добавляйте, ищите и удаляйте информацию из Elasticsearch.

Давайте создадим простой скрипт Python для добавления, поиска и удаления информации в Elasticsearch. Этот сценарий использует записи данных, сгенерированные генератором данных JSON на этом веб-сайте. Цель скрипта:

  • Сначала скрипт тестирует сервер Elasticsearch на порту 9200.
  • Затем он удаляет все записи из поискового индекса.
  • Затем скрипт добавляет записи в поисковый индекс.
  • Наконец, скрипт находит все записи, возраст которых больше и равен 20.
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Q
from elasticsearch_dsl import Search

# establish connection with Elasticsearch
es = Elasticsearch([{'host': 'localhost', 'port': 9200}])

print (es)

# delete all records from elasticsearch
s1 = Search(using=es, index='my-index').query("range", index={'gte': 0})
response = s1.delete()

data = [
 {
   "index": 0,
   "guid": "e5598a00-b2ed-437c-b13b-1e6f387bf23f",
   "isActive": False,
   "balance": "$2,428.26",
   "picture": "http://placehold.it/32x32",
   "age": 21,
   "eyeColor": "blue",
   "name": "Cherry Baird",
   "gender": "female",
   "company": "UPLINX",
   "email": "[email protected]",
   "phone": "+1 (957) 504-3326",
   "address": "585 Ludlam Place, Deseret, Virginia, 5268",
   "about": "Cupidatat reprehenderit mollit et qui pariatur enim est commodo non duis sit. Do mollit esse commodo ad pariatur dolore qui. Deserunt ullamco eiusmod cillum eiusmod pariatur do minim elit minim veniam incididunt ad Lorem est. Quis elit nostrud non sit dolore. Ea nulla velit enim nostrud Lorem.\r\n",
   "registered": "2015-03-18T11:29:59 -02:00",
   "latitude": 11.444065,
   "longitude": -104.466353,
   "tags": [
     "veniam",
     "amet",
     "nostrud",
     "ipsum",
     "pariatur",
     "ad",
     "sunt"
   ],
   "friends": [
     {
       "id": 0,
       "name": "Clements Fletcher"
     },
     {
       "id": 1,
       "name": "Stuart Mcintosh"
     },
     {
       "id": 2,
       "name": "Finch Cleveland"
     }
   ],
   "greeting": "Hello, Cherry Baird! You have 10 unread messages.",
   "favoriteFruit": "strawberry"
 },
 ... # add more records here
]

# add records to elasticsearch
for body in data:
  result = es.index(index='my-index', body=body)
  print(result)

# form query for search: match company and age 
query = Q('match', company='UPLINX') & Q('range', age={'gte': 20})
s = Search(using=es, index='my-index').query(query)
response = s.execute()

# print search results
for hit in response:
   print(hit.name)

Этот скрипт будет генерировать следующий вывод:

<Elasticsearch([{'host': 'localhost', 'port': 9200}])>
{'_index': 'my-index', '_type': '_doc', '_id': 'BTj4CnkB-8-eDhz1rKIb', '_version': 1, 'result': 'created', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 130, '_primary_term': 5}
{'_index': 'my-index', '_type': '_doc', '_id': 'Bjj4CnkB-8-eDhz1rqJ9', '_version': 1, 'result': 'created', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 131, '_primary_term': 5}
...
{'_index': 'my-index', '_type': '_doc', '_id': 'Czj4CnkB-8-eDhz1saI1', '_version': 1, 'result': 'created', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 136, '_primary_term': 5}
Cherry Baird
Manning Maddox
Hawkins Wilson

Здесь мы нашли 3 записи с возрастом более 20 лет и указанными параметрами запроса. Этот простой пример демонстрирует, как создавать поисковые системы с библиотеками Python и использовать мощные поисковые системы, такие как Elasticsearch.

Заключение

Даже с такой сложной системой, как Elasticsearch, можно работать с библиотекой на языке Python и достаточно эффективно решать поставленные задачи. При этом основная вычислительная нагрузка лежит на стороне Elasticsearch и Python никак не тормозит поисковую систему. По функционалу и возможностям построения запросы в поисковую систему, Elasticsearch-DSL библиотека также предоставляет широкие возможности и позволяет решать практические задачи по поиску необходимой информации.

Квалифицированные инженеры-программисты Semrush Systems имеют большой опыт работы с Elasticsearch и информационно-поисковыми системами. Вы можете обратиться в нашу компанию за разработкой программного обеспечения, в том числе сложных программных комплексов, в которых необходимо реализовать различные методы поиска информации. Также наши разработчики умеют грамотно построить архитектуру системы, которая будет максимально быстро работать с большими объемами информации и с использованием облачных систем.