Базы данных: ElasticSearch
ElasticSearchopen in new window — поисковый движок, хранит документы, строит по ним индексы и позволяет быстро искать документы по набору условий. Под документом следует понимать набор полей по которым производится поиск. Индекс, в контексте ElasticSearch, не то же самое, что индекс в реляционной БД, а скорее именованная коллекция документов.
Запуск
Запустить ElasticSearch проще всего через dockeropen in new window.
docker run -d --name elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \
elasticsearch:8.6.2
1
2
3
4
5
2
3
4
5
Проверка работы
Для проверки работы обратитесь в браузере к порту http://localhost:9200
или командой
curl -X GET localhost:9200
1
В результате будет получен JSON с информацией о сервере:
{
"name" : "10fb6274b140",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "NJx2y2iiSJizhkWQHA0zwg",
"version" : {
"number" : "8.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "2d58d0f136141f03239816a4e360a8d17b6d8f29",
"build_date" : "2023-02-13T09:35:20.314882762Z",
"build_snapshot" : false,
"lucene_version" : "9.4.2",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Пример на Python
Пример использования библиотеки elasticsearchopen in new window:
from elasticsearch import Elasticsearch
# Подключение к Elasticsearch
es = Elasticsearch("http://debian-server:9200")
# Проверка подключения
if not es.ping():
print("Elasticsearch не доступен!")
else:
print("Подключение к Elasticsearch успешно!")
# Создание нового индекса
index_name = "my_documents3"
try:
es.indices.create(index=index_name)
print(f"Индекс '{index_name}' успешно создан.")
except Exception as e:
print(f"Индекс уже существует или произошла ошибка: {e}")
# Добавление документов с разнообразным английским текстом
documents = [
{"title": "Document 1", "content": "The quick brown fox jumps over the lazy dog."},
{"title": "Document 2", "content": "Artificial intelligence is transforming the world."},
{"title": "Document 3", "content": "The universe is vast and full of mysteries."},
{"title": "Document 4", "content": "Cooking is an art that requires creativity and passion."},
{"title": "Document 5", "content": "Traveling opens your mind to new cultures and experiences."},
]
for i, doc in enumerate(documents):
es.index(index=index_name, id=i, document=doc)
print("Документы добавлены!")
# Явный вызов refresh для обновления индекса
es.indices.refresh(index=index_name)
# Проверка количества документов в индексе
doc_count = es.count(index=index_name)['count']
print(f"Количество документов в индексе '{index_name}': {doc_count}")
# Поиск документов
search_query = {
"match": {
"content": "art" # Ищем слово "art"
}
}
response = es.search(index=index_name, body={"query": search_query})
print("Результаты поиска:")
for hit in response['hits']['hits']:
print(f"ID: {hit['_id']}, Title: {hit['_source']['title']}, Content: {hit['_source']['content']}")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Ввод программы:
Подключение к Elasticsearch успешно!
Индекс 'my_documents3' успешно создан.
Документы добавлены!
Количество документов в индексе 'my_documents3': 5
Результаты поиска:
ID: 3, Title: Document 4, Content: Cooking is an art that requires creativity and passion.
1
2
3
4
5
6
2
3
4
5
6