Использование поиска в UI

Визуальные компоненты

Дополнение Search предоставляет два UI-компонента: SearchField и FullTextFilter.

Стратегии поиска

Стратегия поиска определяет, как обрабатывается поисковый термин. По сути, она конфигурирует поисковый запрос с определенным запросом.

Компоненты SearchField и FullTextFilter поддерживают следующие встроенные стратегии поиска:

  • startsWith

    Эта стратегия доступна только когда @ExtendedSearch включен хотя бы для одного определения индекса.

    Выполняет поиск на основе префикса, используя предварительно индексированные подполя Edge N-Gram:

    • Генерирует все префиксы от jmix.search.min-prefix-length (по умолчанию: 3) до jmix.search.max-prefix-length (по умолчанию: 8).

    • Обеспечивает значительно более высокую производительность по сравнению с запросами по шаблону (wildcard).

    • Когда введенный термин превышает максимальную длину префикса, выполняется резервный запрос по шаблону, если jmix.search.wildcard-prefix-query-enabled = true (значение по умолчанию).

      Для терминов короче, чем jmix.search.min-prefix-length, поиск всегда возвращает пустой результат.
  • phrase

    Выполняет поиск точной фразы:

    • Документы должны содержать все поисковые термины в точном порядке в рамках одного поля.

    • Эквивалентно традиционному фразовому запросу в поисковых системах.

    • Идеально подходит для поиска по именам, названиям или точным формулировкам.

  • anyTermAnyField

    Выполняет дизъюнктивное сопоставление терминов по всем полям:

    • Возвращаются документы, соответствующие любому из введенных терминов в любом индексированном поле.

    • Термины комбинируются с логикой ИЛИ.

    • Стратегия по умолчанию для обратной совместимости.

    Эта стратегия установлена по умолчанию.

allTermsAnyField и allTermsSingleField объявлены устаревшими и скрыты из пользовательского интерфейса, но при необходимости могут быть повторно реализованы.

Вы можете установить нужную стратегию, используя атрибут searchStrategy, например:

<search:fullTextFilter dataLoader="ordersDl"
                       autoApply="true"
                       searchStrategy="anyTermAnyField"/>

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

jmix.search.default-search-strategy = phrase

Пользовательские стратегии поиска

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

  • AbstractOpenSearchStrategy - если используется OpenSearch.

  • AbstractElasticSearchStrategy - если используется Elasticsearch.

Реализуйте методы getName() и configureRequest(SearchRequestContext):

@Component
public class CustomOpenSearchSearchStrategy extends AbstractOpenSearchStrategy {

    public CustomOpenSearchSearchStrategy(OpenSearchQueryConfigurer queryConfigurer) {
        super(queryConfigurer); (1)
    }

    @Override
    public String getName() {
        return "CustomStrategy"; (2)
    }

    @Override
    public void configureRequest(SearchRequestContext<SearchRequest.Builder> requestContext) { (3)
        queryConfigurer.configureRequest( (4)
                requestContext,
                (queryBuilder, scope) -> (5)
                        queryBuilder.multiMatch(multiMatchQueryBuilder ->
                                multiMatchQueryBuilder
                                        .fields(scope.getFieldList()) (6)
                                        .query(requestContext.getSearchContext().getEscapedSearchText())
                                        .operator(Operator.Or)
                        )
        );
    }
}
1 The base class is initialized with the platform-specific query configurer (OpenSearchQueryConfigurer or ElasticSearchQueryConfigurer), available as the queryConfigurer field.
2 getName() returns a unique strategy name used to select the strategy.
3 configureRequest(SearchRequestContext) is the method the search engine invokes for the strategy — implement it to build the search request.
4 Build the query through queryConfigurer.configureRequest(). The configurer resolves the search scope - the target indexes and the fields the current user is permitted to read - and applies security policies.
5 The lambda receives the platform-specific query builder and the resolved IndexSearchRequestScope.
6 Use scope.getFieldList() to search only the permitted fields.

Always build the query through queryConfigurer. If you configure the request builder directly (for example, with fields("*")), the search scope is not resolved and attribute policies are not applied, which can make the search return no results.

После этого вы можете назначить вашу пользовательскую стратегию компоненту SearchField или FullTextFilter, используя имя стратегии.

Условие полнотекстового поиска в компоненте GenericFilter

Когда дополнение Search добавлено в проект, в диалоговом окне Add condition компонента GenericFilter появляется новое условие:

add condition

В диалоговом окне Full-text filter condition editor вы можете определить надпись для полнотекстового фильтра и выбрать стратегию поиска. Если стратегия поиска не выбрана, то используется стратегия по умолчанию.

condition editor

Впоследствии записи в компоненте списка, связанном с фильтром, будут фильтроваться на основе результата полнотекстового поиска.

Использование Search API в экранах

Вы можете использовать Search API в контроллерах экранов. Рассмотрим пример:

@Autowired
private EntitySearcher entitySearcher;

@Autowired
private SearchResultProcessor searchResultProcessor;

@Subscribe(id = "searchBtn", subject = "clickListener") (1)
public void onSearchBtnClick(final ClickEvent<JmixButton> event) {
    SearchContext searchContext = new SearchContext("silver") (2)
            .setSize(20) (3)
            .setEntities("Order_"); (4)
    SearchResult searchResult = entitySearcher.search(searchContext); (5)
    Collection<Object> instances =
            searchResultProcessor.loadEntityInstances(searchResult); (6)
    // ...
}
1 API вызывается из экрана при нажатии на кнопку.
2 Определение поисковой строки обязательно: здесь запрос будет искать по всем полям, помеченным для индексации, которые содержат строку "silver".
3 Добавляет условия для запроса: во-первых, максимальное количество записей в результирующем наборе. Значение по умолчанию - 10.
4 Далее, список сущностей, в которых осуществляется поиск. По умолчанию включены все индексированные сущности.
5 Сервис EntitySearcher используется для начала поиска.
6 SearchResultProcessor используется для извлечения сущностей из результата поиска.