用于排序的 Hibernate 搜索分析器
Hibernate Search Analyzer for Sort
在 Hibernate Search 5.3 上,我一直在尝试构建一个分析器,该分析器适用于对通过 Hibernate Search 索引的许多字段进行排序。我知道对于排序一个不应该分析的字段,但只要你的分析器 returns 一个单一的标记我相信这是没问题的,再加上你可以使用一些预建的过滤器来区分大小写,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。我的问题是推荐什么?电桥与分析仪相比有什么优势吗?
我尝试使用的分析器无法正常工作的原因是什么?
EdgeNGramFilterFactory 将创建多个令牌,这将违反 "single token" 的原则。所以这就是它不起作用的原因。
通常,当需要应用标记化并在 属性 上排序时,解决方案是将 属性 索引为多个字段。
参见@Fields
注释:
@Fields({
@Field(name="sortable_something",analyzer=@Analyzer(definition="sortable_html_key")),
@Field(name="something",analyzer=@Analyzer(definition="html_ngrams_key"))
})
public String getSomething() {
在 Hibernate Search 5.3 上,我一直在尝试构建一个分析器,该分析器适用于对通过 Hibernate Search 索引的许多字段进行排序。我知道对于排序一个不应该分析的字段,但只要你的分析器 returns 一个单一的标记我相信这是没问题的,再加上你可以使用一些预建的过滤器来区分大小写,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。我的问题是推荐什么?电桥与分析仪相比有什么优势吗?
我尝试使用的分析器无法正常工作的原因是什么?
EdgeNGramFilterFactory 将创建多个令牌,这将违反 "single token" 的原则。所以这就是它不起作用的原因。
通常,当需要应用标记化并在 属性 上排序时,解决方案是将 属性 索引为多个字段。
参见@Fields
注释:
@Fields({
@Field(name="sortable_something",analyzer=@Analyzer(definition="sortable_html_key")),
@Field(name="something",analyzer=@Analyzer(definition="html_ngrams_key"))
})
public String getSomething() {