2

我正在使用ElasticSearch 2.4.2(通过Java的HibernateSearch 5.7.1.Final)。ElasticSearch - 为排序定义自定义字母顺序

我有一个字符串排序问题。 我的应用程序的语言具有变音符号,其中有一个特定的字母 排序。例如Ł去直接L后,ÓO后,等 所以,你应该像这样的字符串进行排序:

Dla 
Dła 
Doa 
Dóa 
Dza 
Eza 

ElasticSearch通过各种典型的字母第一,并在移动所有怪 字母end:

Dla 
Doa 
Dza 
Dła 
Dóa 
Eza 

我可以为ElasticSearch添加自定义字母排序吗? 也许有一些插件呢? 我是否需要编写自己的插件?我如何开始?

我发现了一个plugin为ElasticSearch, 波兰语,但据我所知它是分析和分析是不是在我的情况的解决方案 ,因为它会忽略变音符号和与L离开文字和Ł混合:

Dla 
Dłb 
Dlc 

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

我将不胜感激对此的评论。

回答

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

这肯定有点笨拙,但分析仪配置在下一个Hibernate搜索版本中会变得更清晰一点,其版本号为normalizers and analyzer definition providers

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