【问题标题】:Hibernate search highlighting not analyzed fields休眠搜索突出显示未分析的字段
【发布时间】:2017-12-06 11:30:19
【问题描述】:

如果它们与搜索查询匹配,我想突出显示整个未分析的字段。
索引实体如下所示:

@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;   

}

假设我有一个DocumentnotAnalyzedField: "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);
}

结果我得到以下 sn-p:"a-&lt;span&gt;bbb&lt;/span&gt;-&lt;span&gt;ccc&lt;/span&gt;".
这似乎是合理的,因为分析器将a 符号视为停用词,将- 视为分隔符并且不会突出显示它们。但我无法弄清楚如何在突出显示该字段时避免使用分析器。 Highlighter 类中有一些方法需要 TokenStream 而不是 Analyzer 但我不确定如何使用它们。

我想要实现的结果是整个突出显示的字段:"&lt;span&gt;a-bbb-ccc&lt;/span&gt;"
有没有办法通过 hibernate-search 实现这一点?

【问题讨论】:

    标签: java hibernate lucene hibernate-search


    【解决方案1】:

    您的分析仪来自哪里?

    您可能想从 Hibernate Search 中获取它:

    FullTextEntityManager em = /*...*/;
    Analyzer analyzer = em.getSearchFactory()
        .getAnalyzer(Document.class);
    highlightText(query, analyzer, fieldName, text);
    

    如果不起作用,请尝试使用KeywordAnalyzerhighlightText(query, new KeywordAnalyzer(), fieldName, text);

    【讨论】:

    • 我已经用我使用的自定义分析器的定义更新了这个问题。它的主要目标是有一个自定义的停用词列表。它用于突出显示过程。在这种情况下,KeywordAnalyzer 对我不起作用。
    • @IlyaZinkovich 您说您不希望使用分析器,并且希望突出显示整个文本,现在您说要使用自定义停用词,这意味着分析。好像有点矛盾……?您使用 KeywordAnalyzer 得到了什么结果,这个结果到底有什么问题?
    • 没有分析需要突出显示的字段,但分析器仍然存在,因为它用于所有其他字段。我尝试仅在突出显示阶段使用 KeywordAnalyzer,但它没有突出显示任何内容。
    • 好的,我不知道您在做什么,但您可能将错误的参数传递给您的方法(查询、文本等)。我用KeywordAnalyzer 单独尝试了您的代码,它按预期工作:gist.github.com/yrodiere/b2f70e88f2f9700715867c4de25c1732。当你说“它不起作用”时,请告诉我你的确切意思,否则我无法帮助你。
    • @Yoannn,非常感谢您的帮助。问题是我使用不同的分析器进行索引和突出显示。我还使用 PatternTokenizer 修补了我的自定义分析器,将 x-xxx-xxxx 格式的完整字符串添加到索引中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2015-02-01
    • 2023-01-16
    • 1970-01-01
    相关资源
    最近更新 更多