ElasticSearch – 定义排序的自定义字母顺序
我正在使用ElasticSearch 2.4.2(来自Java的HibernateSearch 5.7.1.Final)。
我有字符串排序的问题。 我的应用程序的语言有变音符号,它具有特定的字母顺序。 例如, Ł
直接在L
之后, Ó
在O
之后,等等。所以你应该像这样排序字符串:
Dla Dła Doa Dóa Dza Eza
ElasticSearch首先按典型字母排序,并在结尾处移动所有奇怪的字母:
Dla Doa Dza Dła Dóa Eza
我可以为ElasticSearch添加自定义字母顺序吗? 也许有一些插件吗? 我需要编写自己的插件吗? 我该如何开始?
我为ElasticSearch找到了一个波兰语插件 ,但据我所知它是用于分析,并且分析在我的情况下不是解决方案,因为它会忽略变音符号并留下L
和Ł
混合的单词:
Dla Dłb Dlc
这有时是可以接受的,但在我的具体用例中是不可接受的。
对此有任何评论我将不胜感激。
我从来没有使用它,但有一个插件可以满足您的需求: ICU整理插件 。
您必须使用icu_collation
标记filter,它会将标记转换为排序键。 因此,您需要在Hibernate Search中使用单独的@Field
(例如myField_sort
)。
您可以使用@Field(name = "myField_sort", analyzer = @Analyzer(definition = "myCollationAnalyzer"))
将特定分析器分配给您的字段,并在您的某个实体上使用类似的内容定义此分析器(类型,参数) :
@Entity @Indexed @AnalyzerDef( name = "myCollationAnalyzer", filters = { @TokenFilterDef( name = "polish_collation", factory = ElasticsearchTokenFilterFactory.class, params = { @Parameter(name = "type", value = "'icu_collation'"), @Parameter(name = "language", value = "'pl'") } ) } ) public class MyEntity {
有关更多信息,请参阅文档: https : //docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#_custom_analyzers
现在肯定有点笨拙,但在下一个带有规范化器和分析器定义提供程序的 Hibernate Search版本中,分析器配置会更加清晰 。
注意:像往常一样,您的字段需要声明为可排序( @SortableField(forField = "myField_sort")
)。