【问题标题】:Hibernate Search Analyzer for Sort用于排序的 Hibernate 搜索分析器
【发布时间】:2016-02-28 00:55:04
【问题描述】:

在 Hibernate Search 5.3 上,我一直在尝试构建一个分析器,该分析器适合对通过 Hibernate Search 索引的许多字段进行排序。我知道对于排序不应该分析该字段,但只要您的分析器返回一个标记,我相信这没问题,另外您可以使用一些预构建的过滤器来区分大小写,HTML 剥离,在我的情况下,我也想只按前 20 个字符排序。

所以,这样的事情似乎可行。

@AnalyzerDef(name = "sortAnalyzer", 
    tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class) ,        
    charFilters = { @CharFilterDef(factory = HTMLStripCharFilterFactory.class) },
    filters = 
            { 
                @TokenFilterDef(
                        factory = EdgeNGramFilterFactory.class,
                        params = {
                          @Parameter(name = "minGramSize",value = "20"),
                          @Parameter(name = "maxGramSize",value = "20")
                        }
                    ),                  
                @TokenFilterDef(factory = LowerCaseFilterFactory.class),
                @TokenFilterDef(factory = TrimFilterFactory.class)
            }
        ),

但它只有在我删除 EdgeNGramFilterFactory 时才有效。我想我可以只做一个桥来做子串。再说一次,我可以使用桥接器来完成整个事情并设置Analyze.NO。我的问题是推荐什么?桥接器与分析器相比有什么优势?

我尝试使用的分析器因任何原因不起作用?

【问题讨论】:

    标签: hibernate-search


    【解决方案1】:

    一个 EdgeNGramFilterFactory 将创建多个令牌,这将违反“单个令牌”的原则。所以这就是它不起作用的原因。

    一般当需要对一个属性进行标记化和排序时,解决方案是将属性索引为多个字段。

    @Fields注解:

    @Fields({
       @Field(name="sortable_something",analyzer=@Analyzer(definition="sortable_html_key")),
       @Field(name="something",analyzer=@Analyzer(definition="html_ngrams_key"))
    })
    public String getSomething() {
    

    【讨论】:

    • 谢谢@Sanne - 我认为我的想法是滥用EdgeNGramFilterFactory 作为子字符串,因为我告诉它只给我20个字符的最小值和最大值,只有一个可能的令牌工作左边,那将是前 20 个字符。但是,无论如何,我决定使用桥接来处理子字符串,而分析器来完成其余的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2023-03-25
    • 1970-01-01
    • 2014-02-25
    • 2014-02-15
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多