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

ElasticSearch - define custom letter order for sorting

我正在使用 ElasticSearch 2.4.2(通过 HibernateSearch 5.7。1.Final 来自 Java)。

我对字符串排序有疑问。 我的应用程序的语言有变音符号,有特定的字母 订购。例如 Ł 紧跟在 [=14= 之后],Ó 紧跟在 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

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

如有任何评论,我将不胜感激。

我从未使用过它,但有一个插件可以满足您的需求: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

诚然现在有点笨拙,但在下一个 Hibernate Search 版本 normalizers and analyzer definition providers.

中,分析器配置会变得更清晰一些

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