Hibernate搜索6与Lucene荧光笔和同义词列表



我们有一个很大的同义词列表。我使用手动分析器来索引搜索字段。同义词列表用">SynonymGraphFilterFactory注释。";过滤器。到目前为止一切都很好。当我在球场上进行搜索时,我得到匹配的结果。同义词列表是这样的:车,车辆

如果输入"car"在我的搜索中,会显示正确的结果,并显示"汽车"这个词。突出显示。

当我输入"vehicle"我得到正确的结果,但没有突出显示。

我想在搜索中突出显示这两个词。"car"one_answers";vehicle"。这可能吗?

到目前为止,我还没有找到一个合适的解决方案。也许有人能帮我一下。

配置:Hibernate-search 6, Lucene Higlighter 8.7

代码:

要索引搜索字段,我的分析器看起来像这样:

context.analyzer ("myCustomAnalyzer"). custom ()
.tokenizer (StandardTokenizerFactory.class)
.tokenFilter (LowerCaseFilterFactory.class)
.tokenFilter (KeywordRepeatFilterFactory.class)
.tokenFilter (PorterStemFilterFactory.class)
.tokenFilter (TrimFilterFactory.class)
.tokenFilter (SnowballPorterFilterFactory.class) .param ("language", "German")
.tokenFilter (RemoveDuplicatesTokenFilterFactory.class)
.tokenFilter (SynonymGraphFilterFactory.class) .param ("synonyms", "synonyms / synonyms.properties")
.param ("ignoreCase", "true"). param ("expand", "true");

荧光笔方法如下:

private Results highlighting(final Results results, final String mySearchString) {
final SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("start", "end");
final TermQuery query = new TermQuery(
new Term("indexFieldName", mySearchString));
final QueryScorer queryScorer = new QueryScorer(query, "indexFieldName");
final Fragmenter fragmenter = new SimpleSpanFragmenter(queryScorer);
queryScorer.setExpandMultiTermQuery(true);
final Highlighter highlighter = new Highlighter(simpleHTMLFormatter, queryScorer);
highlighter.setTextFragmenter(fragmenter);
try (Analyzer analyzer = new StandardAnalyzer()) {
for (final MyEntity my : results.getMyResults()) {
for (final MySecondEntity sec : my.getMyDescriptions()) {
final String text = sec.getMyName();
try {
final TokenStream tokenStream = analyzer.tokenStream(
"indexFieldName", new StringReader(text));
final String result = highlighter.getBestFragments(
tokenStream, text,
sec.getMyName().length(), " ...");
if (!StringUtils.isBlank(result)) {
sec.setMyName(result);
}
} catch (final Exception e) {
LOG.warn(String.format(
"Failure during highlighting process for ..."...
}
}
}
}
return results;
}

谢谢你的回答

我不太熟悉荧光笔,但在您的代码中有一件事似乎很可疑,那就是您正在使用StandardAnalyzer来突出显示。如果您希望突出显示同义词,我认为您需要使用处理同义词的分析器。

尝试使用相同的分析器进行索引和高亮显示。

您可以从Hibernate Search中检索分析器实例。请参阅文档的这一部分,或以下示例:

LuceneBackend luceneBackend =
Search.mapping( entityManager.getEntityManagerFactory() )
.backend().unwrap( LuceneBackend.class ); 
Analyzer analyzer = luceneBackend.analyzer( "myCustomAnalyzer" ).get(); 

然后在高亮代码中使用它而不是new StandardAnalyzer();只要确保你没有关闭这个分析器。

最新更新