Hibernate-Search - Поиск по шаблону без учета регистра с использованием синтаксиса синтаксического анализатора запросов lucene (без использования QueryBuilder!) - PullRequest
1 голос
/ 25 июня 2019

Во-первых, вот моя настройка времени индексации Hibernate-Search:

// ...
@Indexed(index = "XXXRequestIndex")
@AnalyzerDef(name = "toLowercaseAnalyzer",
    tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class),
    filters = {
        @TokenFilterDef(factory = LowerCaseFilterFactory.class)
    })
public class XXXRequest implements Serializable {
    // ...
    @Field(analyze = Analyze.YES, store = Store.YES, analyzer = @Analyzer(definition = "toLowercaseAnalyzer"))
    @SortableField
    private String status;
    // ...
}

Я видел эту ветку, где .overridesForField(...) настроен на QueryBuilder для поля во время запроса для запроса без учета регистра с подстановочными знаками: Hibernate Поиск | ngram анализатор с minGramSize 1

Мне нужно сделать что-то подобное только для определенного поля («статус»), но я НЕ использую QueryBuilder, вместо этого я анализирую строку входящего запроса lucene, используя MultiFieldQueryParser , Я не могу изменить это, чтобы переключиться на построение запроса, используя QueryBuilder, потому что для вызывающих код пользователей важно выдавать свои собственные динамические запросы с использованием синтаксиса синтаксического анализатора запросов lucene (как описано более или менее в https://lucene.apache.org/core/2_9_4/queryparsersyntax.html)

Таким образом, когда вызывающий абонент отправляет в качестве запроса lucene status:*n\ Pr*, он не соответствует «В обработке». Однако запрос, подобный status:*n\ pr*, действительно соответствует "В обработке".

Мой код запроса:

Analyzer analyzer = new KeywordAnalyzer();
String[] fields = ...
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
    fields,
    analyser);

Query luceneQuery = queryParser.parse(luceneFilterString);
List results = fullTextQuery.getResultList();

Как сделать запрос без учета регистра?

1 Ответ

1 голос
/ 25 июня 2019

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

Другой вариант - использовать функцию простой строки запроса (см. https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#_simple_query_string_queries),, которая может применять анализ к такого рода запросам, но поддерживает только запросы с префиксом (поэтому вы можете искать process*, но не * 1007). *). Если это ограничение приемлемо для вас, я очень рекомендую этот подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...