带 Lucene 荧光笔和同义词列表的 Hibernate Search 6
Hibernate Search 6 with Lucene Highlighter and Synonym List
我们有一个很大的同义词列表。我使用手动分析器来索引搜索字段。同义词列表使用“SynonymGraphFilterFactory”过滤器进行注释。到目前为止一切都很好。当我在该字段上进行搜索时,我得到了匹配的结果。
同义词列表如下所示:
汽车,交通工具
如果我在搜索中输入“汽车”,则会显示正确的结果并突出显示“汽车”一词。
当我输入“车辆”一词时,我得到了正确的结果,但没有突出显示任何内容。
我想在搜索中突出显示这两个词。 “汽车”和“车辆”。
这可能吗?
到目前为止我还没有找到合适的解决方案。也许有人可以在这里帮助我。
配置:
Hibernate-search 6,Lucene Higlighter 8.7
代码:
To index the search field, my analyzer looks like this:
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");
Highlighter method looks like this:
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 中检索分析器实例。请参阅 this section of the documentation,或此示例:
LuceneBackend luceneBackend =
Search.mapping( entityManager.getEntityManagerFactory() )
.backend().unwrap( LuceneBackend.class );
Analyzer analyzer = luceneBackend.analyzer( "myCustomAnalyzer" ).get();
然后在您的突出显示代码中使用它代替 new StandardAnalyzer()
;请确保您没有关闭此分析器。
我们有一个很大的同义词列表。我使用手动分析器来索引搜索字段。同义词列表使用“SynonymGraphFilterFactory”过滤器进行注释。到目前为止一切都很好。当我在该字段上进行搜索时,我得到了匹配的结果。 同义词列表如下所示: 汽车,交通工具
如果我在搜索中输入“汽车”,则会显示正确的结果并突出显示“汽车”一词。
当我输入“车辆”一词时,我得到了正确的结果,但没有突出显示任何内容。
我想在搜索中突出显示这两个词。 “汽车”和“车辆”。 这可能吗?
到目前为止我还没有找到合适的解决方案。也许有人可以在这里帮助我。
配置: Hibernate-search 6,Lucene Higlighter 8.7
代码:
To index the search field, my analyzer looks like this:
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");
Highlighter method looks like this:
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 中检索分析器实例。请参阅 this section of the documentation,或此示例:
LuceneBackend luceneBackend =
Search.mapping( entityManager.getEntityManagerFactory() )
.backend().unwrap( LuceneBackend.class );
Analyzer analyzer = luceneBackend.analyzer( "myCustomAnalyzer" ).get();
然后在您的突出显示代码中使用它代替 new StandardAnalyzer()
;请确保您没有关闭此分析器。