@AnalyzerDef(
name = "tags",
tokenizer =
@TokenizerDef(factory = PatternTokenizerFactory.class,
params = {
@Parameter(name = "pattern", value=",")
}
),
filters = {
@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(
factory = StopFilterFactory.class,
params = {
@Parameter(name = "words", value = "data/ignorewords.txt"),
@Parameter(name = "ignoreCase", value = "true")
}
),
@TokenFilterDef(
factory = SynonymFilterFactory.class,
params = {
@Parameter(name = "ignoreCase", value="true"),
@Parameter(name = "expand", value="false"),
@Parameter(name = "synonyms", value="data/synonyms.txt")
}
),
@TokenFilterDef(
factory = SnowballPorterFilterFactory.class,
params = {
@Parameter(name = "language", value="English")
}
),
@TokenFilterDef(
factory = ShingleFilterFactory.class,
params = {
@Parameter(name = "minShingleSize", value="2"),
@Parameter(name = "maxShingleSize", value="3"),
@Parameter(name = "outputUnigrams", value="true"),
@Parameter(name = "outputUnigramsIfNoShingles", value="false")
}
),
@TokenFilterDef(
factory = PositionFilterFactory.class,
params = {
@Parameter(name = "positionIncrement", value = "100")
}
),
@TokenFilterDef(
factory = PhoneticFilterFactory.class,
params = {
@Parameter(name = "encoder", value="RefinedSoundex"),
@Parameter(name = "inject", value="true")
}
)
}
),
@AnalyzerDef(
name = "querytime",
tokenizer =
@TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = StopFilterFactory.class,
params = {
@Parameter(name = "words", value = "data/ignorewords.txt"),
@Parameter(name = "ignoreCase", value = "true")
}
),
@TokenFilterDef(
factory = SnowballPorterFilterFactory.class,
params = {
@Parameter(name = "language", value="English")
}
),
@TokenFilterDef(
factory = ShingleFilterFactory.class,
params = {
@Parameter(name = "minShingleSize", value="2"),
@Parameter(name = "maxShingleSize", value="3"),
@Parameter(name = "outputUnigrams", value="true"),
@Parameter(name = "outputUnigramsIfNoShingles", value="false")
}
),
@TokenFilterDef(
factory = PositionFilterFactory.class,
params = {
@Parameter(name = "positionIncrement", value = "100")
}
),
@TokenFilterDef(
factory = PhoneticFilterFactory.class,
params = {
@Parameter(name = "encoder", value="RefinedSoundex"),
@Parameter(name = "inject", value="true")
}
)
}
)
})
Выше моего анализатора Определение, где я использую PatternTokenizerFactory по времени индексирования фразы с несколькими словами. И еще один с StandardTokenizerFactory с ShingleFilterFactory, который будет использоваться во время запроса, но, тем не менее, я не могу получить комбинации токенов из своего поискового запроса. Что я ожидал, что было: когда поисковый запрос Мой Поиск Запрос, он должен был мой поиск и поисковый запрос, но вместо этого я получаю мой, поиск и запросКак заставить ShingleFilterFactory работать с Hibernate Search?
Ниже моя функция
FullTextSession fullTextSession = Search.getFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();
// create native Lucene query
org.apache.lucene.search.Query luceneQuery = null;
String[] fields = new String[] {"tags"};
MultiFieldQueryParser parser = new MultiFieldQueryParser(
Version.LUCENE_31, fields, fullTextSession.getSearchFactory().getAnalyzer("querytime"));
try {
luceneQuery = parser.parse(searchQuery);
} catch (ParseException e) {
e.printStackTrace();
}
// wrap Lucene query in a org.hibernate.Query
org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery(luceneQuery, CityArea.class);
// execute search
List result = hibQuery.list();
tx.commit();
session.close();
return result;
проблема мой индекс маркера являются напр: скажем слово А, Word B и я ищу где слово a (так, чтобы он отображал запись Word A), но результата нет. Это связано с тем, что я не хочу отображать результат до тех пор, пока поисковый запрос не будет содержать индексированную фразу.
Я использовал PatternTokenizerFactory в магазине (индекс), потому что мои теги разделены запятой, например: если теги были => слово А, слово В, слово С и т. Д., Я хочу индексировать слово А, слово В, слово C вместо слова, A, B, C, которое будет выполнять StandardTokenizerFactory, т.е. токенизировать с пространством или специальным символом. Но строка запроса пользовательского поиска была бы строкой, поэтому я хотел использовать ShingleFilterFactory, чтобы получить многозначный токен, чтобы иметь возможность точно искать индексированный токен. – zdesam