Рубрики
Без рубрики

Создание полнотекстового поиска приложения для поиска с использованием Django, Docker и Elasticsearch

В этой статье я буду предоставлять вам краткую информацию о elasticsearch, ее установке и так … Теги с Python, Django, Docker, Elasticsearch.

В этой статье я буду предоставлять вам краткую информацию о elasticsearch, ее установке и некоторых примерах использования.

ElaSticsearch – это распределенный режим в режиме реального времени, а также с открытым исходным и источником полнотекстового поиска и аналитического двигателя. Он доступен из альтернативного интерфейса веб-сервиса и использует документы с схемами JSON (JavaScript Objectation) для хранения данных. Он построен на языке программирования Java, который включает Elasticsearch для работы на разных платформах. Это позволяет пользователям исследовать очень большое количество данных на очень высокой скорости.

Есть некоторые исходные основы Elasticsearch, которые вы вновь усваивали их – сделайте кривую обучения менее травмирующей. Я собрал 4 самых важных концепций:

  1. Поля: самая маленькая индивидуальная единица данных в elasticsearch. Каждое поле имеет определенный DataType; Основные типы данных (строки, номера, даты, логические значения) или сложные типы данных (объект и вложенные).
  2. Индекс: Коллекция различных типов документов и свойств документов. Это можно сравнить с базой данных в мире реляционных баз данных.
  3. Документы: Сборник полей, определенных в формате JSON определенным образом. Каждый документ относится к типу и находится внутри индекса. В мире реляционных баз данных документы можно сравнить с рядом в таблице.
  4. Картирование: Сборник документов, совместно использующих набор общих полей, присутствующих в том же индексе. Опять же, это как схема в мире реляционных баз данных.

⚠️ Стоит отметить, что 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”