ElasticSearch - 定义排序的自定义字母顺序

时间:2017-08-09 18:45:21

标签: java sorting elasticsearch hibernate-search elasticsearch-plugin

我正在使用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找到了一个plugin波兰语, 但据我所知,它是用于分析,而分析不是解决方案 在我的情况下,因为它会忽略变音符号并留下LŁ混合的单词:

 Dla
 Dłb
 Dlc

这有时是可以接受的,但在我的具体用例中是不可接受的。

对此,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

我从未使用它,但有一个插件可以满足您的需求:ICU collation plugin

您必须使用icu_collation令牌过滤器,它会将令牌转换为排序键。因此,您需要在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

现在肯定有点笨拙,但是在normalizers and analyzer definition providers的下一个Hibernate Search版本中,分析器配置会更清晰。

注意:像往常一样,您的字段需要声明为可排序(@SortableField(forField = "myField_sort"))。