我把Hibernate搜索从4.3.0.Final升级到了最新的稳定版本5.4.12.Final。除了排序挪威语单词之外,其他都很好。在旧版本的Hibernate中,构造函数中有带locale的SortField:
/**Creates a sort, possibly in reverse, by terms in the given field sorted
* according to the given locale.
* @param field Name of field to sort by, cannot be <code>null</code>.
* @param locale Locale of values in the field.
*/
public SortField (String field, Locale locale, boolean reverse) {
initFieldType(field, STRING);
this.locale = locale;
this.reverse = reverse;
}
但是在新的Hibernate搜索中,SortField没有locale。根据Hibernate参考文档(https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#_analysis),对于外语中的排序词,我们应该使用CollationKeyFilterFactory和normalizer。但是在这个版本的Hibernate搜索中没有这样的类。Maven pom:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-orm</artifactId>
<version>5.11.5.Final</version>
</dependency>
的问题:我应该使用/创建什么在Hibernate搜索排序挪威语单词?
现在我有这样的排序顺序:
测试,测试,测试,测试,测试,测试
正确顺序:
测试,测试,测试,测试,测试,测试
有CollationKeyAnalyzer类,但我不知道如何使用它进行排序:
public final class CollationKeyAnalyzer extends Analyzer {
private final CollationAttributeFactory factory;
/**
* Create a new CollationKeyAnalyzer, using the specified collator.
*
* @param collator CollationKey generator
*/
public CollationKeyAnalyzer(Collator collator) {
this.factory = new CollationAttributeFactory(collator);
}
@Override
protected TokenStreamComponents createComponents(String fieldName) {
KeywordTokenizer tokenizer = new KeywordTokenizer(factory, KeywordTokenizer.DEFAULT_BUFFER_SIZE);
return new TokenStreamComponents(tokenizer, tokenizer);
}
}
非常相似的问题没有答案:How to do case insensitive sorting of Norwegian characters (Æ, Ø, and Å) using Hibernate Lucene Search?
3条答案
按热度按时间af7jpaap1#
我不知道它对你有多大帮助,但是
CollationKeyFilterFactory
已经过时了,实际上已经被删除了。在类“Javadoc”中,它表示:
不建议使用。
请改用
CollationKeyAnalyzer
。您可以找到Javadoc here。
jutyujz02#
但是在这个版本的Hibernate搜索中没有这样的类。
文档的这一部分看起来过时了,我会考虑更新它。
我找到了
CollationKeyAnalyzer
,但是javadoc声明它已经过时了,应该使用ICUCollationKeyAnalyzer
。尝试将此依赖项添加到POM:
然后创建您自己的分析器类,它使用硬编码的语言环境重新实现
ICUCollationKeyAnalyzer
:然后创建字段:
然后按如下方式对该字段进行排序:
我没有尝试过这个,所以让我们知道如果它为您工作。
deyfvvtc3#
为了解决排序问题,我创建了自己的NorwegianCollationFactory。这不是完美的解决方案,因为我从旧版本的Hibernate搜索(IndexableBinaryStringTools.class)中复制了代码,但它工作得很好。
挪威语排序规则工厂类:
排序规则键筛选器类:
实体Map示例: