Я пытаюсь создать базовый c поиск для моего API-интерфейса. Пользователи передают произвольные запросы, и сервер должен возвращать результаты (очевидно). Я бы предпочел решение, которое работает как с локальным индексом, так и с Elasticsearch.
В своей сущности я определил анализатор следующим образом:
@AnalyzerDef(name = "ngram",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class ),
filters = {
@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = StopFilterFactory.class),
@TokenFilterDef(factory = NGramFilterFactory.class,
params = {
@Parameter(name = "minGramSize", value = "2"),
@Parameter(name = "maxGramSize", value = "3") } )
}
)
Для запроса я попробовал следующее:
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(this.entityManager);
Analyzer analyzer = fullTextEntityManager.getSearchFactory().getAnalyzer("ngram");
QueryParser queryParser = new MultiFieldQueryParser(ALL_FIELDS, analyzer);
queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
org.apache.lucene.search.Query query = queryParser.parse(queryString);
javax.persistence.Query persistenceQuery =
fullTextEntityManager.createFullTextQuery(query, MyEntity.class);
List<MyEntity> result = persistenceQuery.getResultList();
Насколько я понимаю, мне нужно предоставить анализатор для запроса, чтобы поисковый запрос был "ngram-tokenized" и чтобы было найдено совпадение. Раньше я использовал SimpleAnalyzer, и в результате поиска соответствовали только полные слова, которые - я думаю, - подтверждают мою теорию (извините, я все еще изучаю это).
Приведенный выше код дает мне исключение NullPointerException:
java.lang.NullPointerException: null
at org.hibernate.search.engine.impl.ImmutableSearchFactory.getAnalyzer(ImmutableSearchFactory.java:370) ~[hibernate-search-engine-5.11.1.Final.jar:5.11.1.Final]
at org.hibernate.search.engine.impl.MutableSearchFactory.getAnalyzer(MutableSearchFactory.java:203) ~[hibernate-search-engine-5.11.1.Final.jar:5.11.1.Final]
at org.hibernate.search.impl.SearchFactoryImpl.getAnalyzer(SearchFactoryImpl.java:50) ~[hibernate-search-orm-5.11.1.Final.jar:5.11.1.Final]
в строке
Analyzer analyzer = fullTextEntityManager.getSearchFactory().getAnalyzer("ngram");