Я определил свой анализатор, как показано ниже
@AnalyzerDefs({
@AnalyzerDef(name = "ngram",
tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class),
filters = {
//@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = NGramFilterFactory.class, params = {
@Parameter(name = "minGramSize", value = "3"),
@Parameter(name = "maxGramSize", value = "255") }) }),
//-----------------------------------------------------------------------
@AnalyzerDef(name = "ngram_query",
tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class),
filters = {
//@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class)
})
})
@Analyzer(definition = "ngram")
public class EPCAsset extends Asset {
@Field
private String obturatorMaterial;
}
Прекрасно делает n-граммы векторов слагаемых в течение индексного времени. Но он также делает n-грамм поискового запроса во время поиска.
То, что я хочу, - это способ, с помощью которого поисковый запрос использует индекс n-грамм для поиска, не разбивая поисковый термин на граммы.
Примечание: здесь я должен использовать n-грамм, потому что требуется искать в любом месте текста. либо в начале, либо в середине. так что ребро-н-грамм для меня не вариант.
Пример:
Входные данные для индексации ICQ 234
Тогда во время индекса его векторы-члены будут
"234"
" 23"
" 234"
"cq "
"cq 2"
"cq 23"
"cq 234"
"icq"
"icq "
"icq 2"
"icq 23"
"icq 234"
"q 2"
"q 23"
"q 234"
Теперь, когда я ищу icq , он работает отлично. Но это также работает для icqabc , так как во время поиска он делает n-грамм поискового запроса. Так есть ли способ, чтобы во время поиска он не нарушал поисковый запрос, а использовал индекс n-граммы для поиска.
Вот мое здание поискового запроса
FullTextEntityManager fullTextEntityManager = Search
.getFullTextEntityManager(entityManager);
QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder()
.forEntity(entityClass).get();
Query query = qb.phrase().onField("obturatorMaterial").sentence("icqabc").createQuery();
FullTextQuery fullTextQuery = fullTextEntityManager.createFullTextQuery(query,
entityClass);
fullTextQuery.getResultList()
Я использую эластичный поиск в качестве бэкенда для поиска в Hibernate.
EDIT:
Я также применил анализатор времени запроса согласно ответу @ yrodiere, но он дает мне ошибку.
QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder()
.forEntity(entityClass).overridesForField("obturatorMaterial","ngram_query").get();
org.hibernate.search.exception.SearchException: HSEARCH000353: Неизвестный анализатор: 'ngram_query'. Убедитесь, что вы определили этот анализатор.
EDIT
По этой ссылке overriderForField при использовании гибернационного поиска с поддержкой эластичного поиска
Теперь я могу определить время запроса 2-го анализатора, и это решило проблему.