В этой статье я буду предоставлять вам краткую информацию о elasticsearch, ее установке и некоторых примерах использования.
ElaSticsearch – это распределенный режим в режиме реального времени, а также с открытым исходным и источником полнотекстового поиска и аналитического двигателя. Он доступен из альтернативного интерфейса веб-сервиса и использует документы с схемами JSON (JavaScript Objectation) для хранения данных. Он построен на языке программирования Java, который включает Elasticsearch для работы на разных платформах. Это позволяет пользователям исследовать очень большое количество данных на очень высокой скорости.
Есть некоторые исходные основы Elasticsearch, которые вы вновь усваивали их – сделайте кривую обучения менее травмирующей. Я собрал 4 самых важных концепций:
- Поля: самая маленькая индивидуальная единица данных в elasticsearch. Каждое поле имеет определенный DataType; Основные типы данных (строки, номера, даты, логические значения) или сложные типы данных (объект и вложенные).
- Индекс: Коллекция различных типов документов и свойств документов. Это можно сравнить с базой данных в мире реляционных баз данных.
- Документы: Сборник полей, определенных в формате JSON определенным образом. Каждый документ относится к типу и находится внутри индекса. В мире реляционных баз данных документы можно сравнить с рядом в таблице.
- Картирование: Сборник документов, совместно использующих набор общих полей, присутствующих в том же индексе. Опять же, это как схема в мире реляционных баз данных.
⚠️ Стоит отметить, что elasticsearch нельзя использовать в качестве базы данных, это не было построено для этой цели. Благодаря этому, лучше, если вы используете его как дополнительную услугу в вашем проекте рядом с PostgreSQL, MySQL или другими базами данных.
Многие учебные пособия используют Django-Haystack , который очень широко используется в сообществе Django, как модульный поиск, чтобы подключить Elasticsearch (или любую другую поисковую систему, такой как Solr, WHOOSH, XAPIAN и т. Д.), Для его минимальных конфигураций и синтаксис запроса аналогичны ORM Django.
Я использовал это с Solr Недавно в проекте, и я был впечатлен тем, как легко его реализовано, я его понравился, но я не буду использовать его в этой статье, я думаю, что сам Elasticsearch прост в использовании.
Я буду использовать Docker для запуска Elasticsearch.
Вот исходный код Таким образом, вы можете видеть именно то, что происходит.
Экземпляр Elasticsearch
Редактировать Docker-Compose.yml
В вашем каталоге проекта добавить службу ES:
es: image: elasticsearch:7.8.1 environment: - discovery.type=single-node ports: - "9200:9200"
Затем добавьте es
К услугам, что приложение Django зависит от App, и Elasticsearch_dsl_hosts = ES: 9200
к docker-compose.env
:
web: build: . command: python /code/manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - 8000:8000 env_file: - docker-compose.env depends_on: - db - es <--- here
Сейчас беги docker-compose up -d --build
Вы можете проверить, работает ли он правильно через CURL:
curl -X GET localhost:9200/_cluster/health
Настройте Elasticsearch
Давайте установим Django Elasticsearch DSL. Используйте свой любимый менеджер Python Package для установки приложения из PYPI, я использую Pipenv.
pipenv install django-elasticsearch-dsl
Как и в случае большинства приложений Django, вы должны добавить django_elasticsearch_dsl
Для установленных_apps в файле настроек:
INSTALLED_APPS = [ ... 'django_elasticsearch_dsl', ... ]
Затем вы должны определить elasticsearch_dsl в ваших настройках django.
ELASTICSEARCH_DSL = { 'default': { 'hosts': os.getenv("ELASTICSEARCH_DSL_HOSTS", 'localhost:9200') }, }
Индекс данных в elasticsearch
Давайте рассмотрим следующую модель:
class Post(models.Model): title = models.CharField(max_length=128) content = models.CharField(max_length=5000) created_at = models.DateTimeField(default=timezone.now) likes = models.PositiveIntegerField(default=0) slug = models.SlugField(max_length=128, db_index=True, null=True) draft = models.BooleanField(default=True) user = models.ForeignKey( User, related_name='posts', on_delete=models.CASCADE ) def __str__(self): return self.title class Meta: app_label = 'posts'
Беги миграции:
docker-compose run web python manage.py makemigrations docker-compose run web python manage.py migrate
Теперь давайте определим индекс Elasticsearch, это обязательно определить класс документа в Документы .py
В вашем каталоге приложений.
from django.contrib.auth import get_user_model from django_elasticsearch_dsl import Document, fields from django_elasticsearch_dsl.registries import registry from .models import Post, Reply User = get_user_model() @registry.register_document class PostDocument(Document): user = fields.ObjectField(properties={ 'id': fields.IntegerField(), 'username': fields.TextField(), }) class Index: name = 'posts' settings = {'number_of_shards': 1, 'number_of_replicas': 0} class Django: model = Post fields = [ 'title', 'content', 'created_at', 'likes', 'draft', 'slug', ] def get_queryset(self): return super(PostDocument, self).get_queryset().select_related( 'user' ) def get_instances_from_related(self, related_instance): if isinstance(related_instance, User): return related_instance.posts.all() elif isinstance(related_instance, Reply): return related_instance.post
Примеры использования
Чтобы заполнить базу данных с некоторым контентом, я сделал команду по этой причине, просто запустите:
docker-compose run web python manage.py load_posts 20
Теперь давайте переведем интерактивную Shell Python ( Docker-Compose Run Web Python Manage.py Shell
) И воспроизводиться с помощью elasticsearch queries:
>>> from posts.documents import PostDocument >>> posts = PostDocument.search() >>> for hit in posts: ... print(hit.title) ... Design half three bar quickly material center. Author true left. Position entire someone study be. School draw individual sell produce brother. Truth drug compare TV modern. Expert apply baby reveal team along. Beautiful for suddenly half. Plant argue enough less order receive sing. Store economy offer decision industry. Beat chair affect assume score occur include laugh. Language poor cell fish worry ready industry use. >>>
Далее я собрал здесь список примеров использования, которые вам могут понадобиться:
search = PostDocument.search() # Filter by single field equal to a value search = search.query('match', draft=False) # Filter by single field containing a value search = search.filter('match_phrase', title="value") # Add the query to the Search object from elasticsearch_dsl import Q q = Q("multi_match", query='python django', fields=['title', 'content']) search = search.query(q) # Query combination or_q = Q("match", title='python') | Q("match", title='django') and_q = Q("match", title='python') & Q("match", title='django') # Exclude items from your query search = search.exclude('match', draft=True) # Filter documents that contain terms within a provided range. # eg: the posts created for the past day search = search.filter('range', created_at={"gte": "now-1d"}) # Ordering # prefixed by the - sign to specify a descending order. search = search.sort('-likes', 'created_at')
Quick Quiz для вас 😄, вы можете отправить свой ответ в комментариях 👇
Как получить опубликованные должности, созданные за прошедшую неделю, которая содержит слово «Использование» в своем названии/контента?
Вот и все!
Честно говоря, это было довольно долго. Если у вас достаточно терпеливы, чтобы прочитать это полное, и найдите его интересным, пожалуйста, поделитесь этим.
Оригинал: “https://dev.to/aymanemx/building-a-full-text-search-app-using-django-docker-and-elasticsearch-3bai”