Параметры конфигурации поиска

Создание индексов

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

  • create-only - каждый отсутствующий индекс будет создан, существующие индексы с нерелевантной конфигурацией останутся как есть.

  • create-or-recreate - каждый отсутствующий индекс будет создан, существующие индексы с нерелевантной конфигурацией будут пересозданы (все данные будут потеряны). Это стратегия по умолчанию.

  • none - отсутствующие индексы игнорируются, существующие индексы с нерелевантной конфигурацией останутся как есть. Эта опция может быть использована, если вы хотите управлять индексами вручную.

Стратегия может быть настроена путем добавления следующего свойства в ваш файл application.properties:

jmix.search.index-schema-management-strategy = create-only

Синхронизация схемы индекса автоматически выполняется при запуске приложения. Кроме того, она может быть выполнена вручную с использованием операций synchronizeXXX EntityIndexing MBean.

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

Именование индексов

Индексы поиска имеют следующий шаблон именования: <prefix><entity_name>.

Префикс по умолчанию - search_index_.

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

Префиксы могут быть настроены путем добавления следующего свойства в ваш файл application.properties:

jmix.search.search-index-name-prefix = demo_prefix_

Также вы можете указать полное имя индекса в атрибуте indexName аннотации @JmixEntitySearchIndex.

Индексация существующих данных

Существует два подхода к индексации существующих данных:

  • Автоматический - является частью синхронизации схемы индекса и включен по умолчанию. Он ставит в очередь все экземпляры каждой сущности, индекс для которой был создан (в фоновом процессе). Автоматическая индексация может быть включена только для определенных сущностей.

  • Ручной - с использованием операции enqueueIndexAll EntityIndexing MBean.

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

jmix.search.enqueue-index-all-on-startup-index-recreation-entities = Order_,Customer

Также вы можете полностью отключить автоматическую индексацию, добавив следующее свойство приложения:

jmix.search.enqueue-index-all-on-startup-index-recreation-enabled = false

Отслеживание сущностей

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

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

jmix.search.changed-entities-indexing-enabled = false

Роли безопасности

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

  • Search: edit filter предоставляет разрешения на добавление условий полнотекстового поиска в фильтр.

  • Search: view search results предоставляет разрешения на доступ к экрану результатов поиска.

Настройки индекса и анализ

Дополнение позволяет вам настраивать параметры индекса, включая анализ.

Эта конфигурация зависит от используемой поисковой платформы (OpenSearch или Elasticsearch) и должна быть соответствующим образом воссоздана при переключении между ними.
  • Создайте Spring-бин, который реализует OpenSearchIndexSettingsConfigurer (или ElasticsearchIndexSettingsConfigurer в случае использования Elasticsearch).

  • Реализуйте метод configure(OpenSearchIndexSettingsConfigurationContext).

Реализация

Настройки могут быть сконфигурированы через builder настроек (принадлежит OpenSearch/Elasticsearch Java API client).

Контекст конфигурации предоставляет два типа настроек builder:

  • Общий - позволяет настраивать настройки, которые будут применены ко всем индексам. Может быть получен через context.getCommonSettingsBuilder().

  • Специфичный для сущности - позволяет настраивать настройки, которые будут применены только к индексу для конкретной сущности. Специфичные для сущности настройки имеют более высокий приоритет и переопределяют общие настройки. Может быть получен через context.getEntitySettingsBuilder(Class).

Используйте методы builder для установки соответствующих настроек индекса.

Используйте .analysis() для начала построения цепочки, которая позволяет создавать пользовательские анализаторы, токенизаторы и т.д.

@Component
public class CustomOpenSearchIndexSettingsConfigurer implements OpenSearchIndexSettingsConfigurer {

    @Override
    public void configure(OpenSearchIndexSettingsConfigurationContext context) {
        IndexSettings.Builder commonSettingsBuilder = context.getCommonSettingsBuilder();
        commonSettingsBuilder
                .maxResultWindow(15000)
                .analysis(analysisBuilder ->
                        analysisBuilder.analyzer("customized_standard", analyzerBuilder ->
                                analyzerBuilder.standard(stdAnalyzerBuilder ->
                                        stdAnalyzerBuilder.maxTokenLength(100)
                                )
                        )
                );

        IndexSettings.Builder orderSettingsBuilder = context.getEntitySettingsBuilder(Order.class);
        orderSettingsBuilder
                .maxResultWindow(15000)
                .maxRegexLength(2000)
                .analysis(analysisBuilder ->
                        analysisBuilder.analyzer("customized_standard", analyzerBuilder ->
                                analyzerBuilder.standard(stdAnalyzerBuilder ->
                                        stdAnalyzerBuilder.maxTokenLength(150)
                                )
                        )
                );
    }
}