Hibernate 搜索突出显示未分析的字段
Hibernate search highlighting not analyzed fields
如果所有未分析的字段与搜索查询匹配,我想突出显示它们。
索引实体如下所示:
@Entity
@Indexed
@AnalyzerDef(
name = "documentAnalyzer",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = ASCIIFoldingFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(
factory = StopFilterFactory.class,
params = {
@Parameter(name = "words", value = "stoplist.properties"),
@Parameter(name = "ignoreCase", value = "true")
}
)
}
)
public class Document {
...
@Field(analyze = Analyze.NO)
private String notAnalyzedField; // has "x-xxx-xxx" format
@Field(analyze = Analyze.YES)
private String analyzedField;
}
假设我有一个 Document
和 notAnalyzedField: "a-bbb-ccc"
,然后我 运行 一个具有相同值的搜索查询并使用以下代码突出显示搜索结果:
String highlightText(Query query, Analyzer analyzer, String fieldName, String text) {
QueryScorer queryScorer = new QueryScorer(query);
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<span>", "</span>");
Highlighter highlighter = new Highlighter(formatter, queryScorer);
return highlighter.getBestFragment(analyzer, fieldName, text);
}
结果我得到以下片段:"a-<span>bbb</span>-<span>ccc</span>"
。
这似乎是合理的,因为分析器将 a
符号视为停止词,将 -
符号视为定界符并且不会突出显示它们。但是我不知道如何在突出显示该字段时避免使用分析器。 Highlighter
class 中有一些方法需要 TokenStream
而不是 Analyzer
但我不确定如何使用它们。
我想要实现的结果是整个突出显示的字段:"<span>a-bbb-ccc</span>"
有没有办法用 hibernate-search 实现这个?
您的分析仪来自哪里?
您可能想从 Hibernate Search 获取它:
FullTextEntityManager em = /*...*/;
Analyzer analyzer = em.getSearchFactory()
.getAnalyzer(Document.class);
highlightText(query, analyzer, fieldName, text);
如果不起作用,请尝试使用 KeywordAnalyzer
:highlightText(query, new KeywordAnalyzer(), fieldName, text);
如果所有未分析的字段与搜索查询匹配,我想突出显示它们。
索引实体如下所示:
@Entity
@Indexed
@AnalyzerDef(
name = "documentAnalyzer",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = ASCIIFoldingFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(
factory = StopFilterFactory.class,
params = {
@Parameter(name = "words", value = "stoplist.properties"),
@Parameter(name = "ignoreCase", value = "true")
}
)
}
)
public class Document {
...
@Field(analyze = Analyze.NO)
private String notAnalyzedField; // has "x-xxx-xxx" format
@Field(analyze = Analyze.YES)
private String analyzedField;
}
假设我有一个 Document
和 notAnalyzedField: "a-bbb-ccc"
,然后我 运行 一个具有相同值的搜索查询并使用以下代码突出显示搜索结果:
String highlightText(Query query, Analyzer analyzer, String fieldName, String text) {
QueryScorer queryScorer = new QueryScorer(query);
SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<span>", "</span>");
Highlighter highlighter = new Highlighter(formatter, queryScorer);
return highlighter.getBestFragment(analyzer, fieldName, text);
}
结果我得到以下片段:"a-<span>bbb</span>-<span>ccc</span>"
。
这似乎是合理的,因为分析器将 a
符号视为停止词,将 -
符号视为定界符并且不会突出显示它们。但是我不知道如何在突出显示该字段时避免使用分析器。 Highlighter
class 中有一些方法需要 TokenStream
而不是 Analyzer
但我不确定如何使用它们。
我想要实现的结果是整个突出显示的字段:"<span>a-bbb-ccc</span>"
有没有办法用 hibernate-search 实现这个?
您的分析仪来自哪里?
您可能想从 Hibernate Search 获取它:
FullTextEntityManager em = /*...*/;
Analyzer analyzer = em.getSearchFactory()
.getAnalyzer(Document.class);
highlightText(query, analyzer, fieldName, text);
如果不起作用,请尝试使用 KeywordAnalyzer
:highlightText(query, new KeywordAnalyzer(), fieldName, text);