Полное руководство по индексированию каталогов в Elasticsearch: методы и примеры кода

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

Содержание:

  1. Базовое индексирование

  2. Массовое индексирование

  3. Отношения между родителями и детьми

  4. Вложенные документы

  5. Денормализованные документы

  6. Пользовательские анализаторы

  7. Обновление проиндексированных документов

  8. Удаление проиндексированных документов

  9. Запрос индексированных каталогов

  10. Вывод

  11. Базовое индексирование:

Самый простой метод индексации каталога в Elasticsearch предполагает создание индекса и сохранение каждого элемента каталога как отдельного документа в этом индексе. Вот пример на Python с использованием официального клиента Elasticsearch Python:

from elasticsearch import Elasticsearch
# Create a connection to Elasticsearch
es = Elasticsearch()
# Index a catalog document
catalog_item = {
    "title": "Product 1",
    "description": "This is the first product in our catalog.",
    "price": 99.99,
    "category": "Electronics"
}
index_response = es.index(index="catalog", doc_type="_doc", body=catalog_item)
  1. Массовое индексирование:

При работе с большими каталогами эффективнее выполнять массовое индексирование. Этот метод позволяет индексировать несколько документов в одном запросе, снижая нагрузку на сеть. Вот пример использования клиента Python:

from elasticsearch.helpers import bulk
# List of catalog documents
catalog_items = [
    {
        "title": "Product 1",
        "description": "This is the first product in our catalog.",
        "price": 99.99,
        "category": "Electronics"
    },
    {
        "title": "Product 2",
        "description": "This is the second product in our catalog.",
        "price": 149.99,
        "category": "Electronics"
    },
    # Add more catalog items here
]
# Perform bulk indexing
bulk(es, ({"_index": "catalog", "_type": "_doc", "_source": item} for item in catalog_items))
  1. Отношения между родителями и детьми:

В некоторых случаях элементы каталога могут иметь иерархические связи. Elasticsearch поддерживает отношения родитель-потомок, позволяя моделировать такие ассоциации. Например, в каталоге могут быть категории, и каждая категория может содержать несколько товаров. Вот пример:

# Index a category
category = {
    "name": "Electronics"
}
category_response = es.index(index="categories", doc_type="_doc", body=category)
# Index a product with a parent category
product = {
    "title": "Product 1",
    "description": "This is the first product in our catalog.",
    "price": 99.99,
    "category": category_response["_id"]
}
product_response = es.index(index="catalog", doc_type="_doc", body=product)
  1. Вложенные документы:

Другой подход к индексированию каталога — использование вложенных документов. Этот метод позволяет хранить массив связанных поддокументов в одном документе каталога. Вот пример:

# Index a catalog document with nested properties
catalog_item = {
    "title": "Product 1",
    "description": "This is the first product in our catalog.",
    "price": 99.99,
    "category": "Electronics",
    "features": [
        {"name": "Color", "value": "Black"},
        {"name": "Size", "value": "Medium"},
        # Add more features here
    ]
}
index_response = es.index(index="catalog", doc_type="_doc", body=catalog_item)
  1. Денормализованные документы:

В определенных сценариях денормализация данных каталога может повысить производительность поиска. Денормализация предполагает дублирование данных в нескольких документах, чтобы исключить необходимость соединений во время запросов. Вот пример:

# Index a catalog document with denormalized properties
catalog_item = {
    "title": "Product 1",
    "description": "This is the first product in our catalog.",
    "price": 99.99,
    "category": "Electronics",
    "category_name": "Electronics"  # Denormalized category name
}
index_response = es.index(index="catalog", doc_type="_doc", body=catalog_item)
  1. Пользовательские анализаторы:

Чтобы повысить релевантность поиска, вы можете настроить анализаторы, используемые во время индексации и выполнения запросов. Анализаторы определяют, как текст токенизируется, нормализуется и обрабатывается. Вот пример создания собственного анализатора индексации каталога:

# Define a custom analyzer
analyzer_settings = {
    "settings": {
        "analysis": {
            "analyzer": {
                "custom_analyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": ["lowercase", "asciifolding"]
                }
            }
        }
    }
}
# Create an index with the custom analyzer
es.indices.create(index="catalog", body=analyzer_settings)
# Index a document using the custom analyzer
catalog_item = {
    "title": "Product 1",
    "description": "This is the first product in our catalog.",
    "price": 99.99,
    "category": "Electronics"
}
index_response = es.index(index="catalog", doc_type="_doc", body=catalog_item)
  1. Обновление проиндексированных документов:

Чтобы обновить индексированные документы каталога, вы можете использовать API обновления. Вот пример изменения цены продукта:

# Update a catalog document
update_response = es.update(index="catalog", doc_type="_doc", id="product_id", body={"doc": {"price": 129.99}})
  1. Удаление проиндексированных документов:

Чтобы удалить элемент каталога из индекса, вы можете использовать API удаления. Вот пример:

# Delete a catalog document
delete_response = es.delete(index="catalog", doc_type="_doc", id="product_id")
  1. Запрос индексированных каталогов:

После того как ваш каталог проиндексирован, вы сможете выполнять мощный поиск с помощью запроса DSL Elasticsearch. Вот пример простого терминального запроса для получения товаров из категории «Электроника»:

# Perform a search query
search_query = {
    "query": {
        "term": {
            "category": "Electronics"
        }
    }
}
search_response = es.search(index="catalog", body=search_query)

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

Реализуя эти методы индексирования каталога в Elasticsearch, вы можете повысить производительность и эффективность функций поиска вашего приложения, предоставляя пользователям удобный и быстрый просмотр каталога.

Не забывайте отслеживать и оптимизировать кластер Elasticsearch для достижения оптимальной производительности по мере увеличения размера и сложности каталога.