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

标签 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 添加自定义字母顺序吗? 也许有一些插件? 我需要编写自己的插件吗?我该如何开始?

我找到了一个 plugin对于 ElasticSearch 的波兰语, 但据我了解,它是为了分析,而分析不是解决方案 在我的例子中,因为它会忽略变音符号并留下 LŁ 混合的单词:

 Dla
 Dłb
 Dlc

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

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

最佳答案

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

您必须使用 icu_collat​​ion token 过滤器,它将 token 转换为排序规则 key 。因此,您需要在 Hibernate Search 中使用单独的 @Field(例如 myField_sort)。

您可以使用 @Field(name = "myField_sort", analyzer = @Analyzer(definition = "myCollat​​ionAnalyzer")) 为您的字段分配特定的分析器,并定义此分析器(类型、参数) 在您的一个实体上使用类似的东西:

@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"))。

关于java - ElasticSearch - 定义用于排序的自定义字母顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45598424/

相关文章:

java - 为什么 OWASP 将 HTML 列入白名单而不是黑名单信任方法?

java - 字符串匹配不适用于特殊字符 "/"

java - 对具有两个属性的对象列表进行排序的时间复杂度是多少?

javascript - Javascript 数组排序的速度取决于对象大小?

scala - 如何序列化elastic4s查询以重用?

elasticsearch - sphinx-doc 搜索引擎插件

java - 卡夫卡连接: How does Kafka Connect read the latest offset?

java - 装饰 ObservableList 并保留更改事件的最佳实践

swift - 按距离排序 Tableview,Swift

Elasticsearch-oss 不能同时绑定(bind)本地和外部地址