当前位置: 首页 > 面试题库 >

ElasticSearch-定义自定义字母顺序进行排序

云昊阳
2023-03-14
问题内容

我正在使用ElasticSearch 2.4.2(通过Java的HibernateSearch 5.7.1.Final)。

我对字符串排序有问题。我的应用程序的语言带有变音符号,它们具有特定的字母顺序。例如Ł,直接在after之后LÓ在after之后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令牌过滤器,该过滤器会将令牌转换为排序键。因此,您需要在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/zh-
CN/html_single/#_custom_analyzers

现在肯定有点笨拙,但是在具有规范化器和分析器定义提供程序的下一个Hibernate Search版本中,分析器配置将变得更加整洁。

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



 类似资料:
  • 问题内容: 我有一个数组: 如果使用,则输出为: 但是我需要实现以下排序: 我想我需要实现和重写方法: 我应该如何解决这个问题? 问题答案: 您还可以添加: 如果数组不区分大小写。 显然,OP不仅要比较字母,还希望比较字母字符串,所以比较复杂:

  • 问题内容: 我有一个对象数组,这些对象的属性称为“ CODE”。 如何通过自定义顺序对数组进行排序,例如: 尝试各种方法均未成功。请帮忙。 问题答案: 您可以将函数与函数一起使用。

  • 问题内容: 我想就这个小问题得到您的帮助。 我想根据 代码 值 而不是字母顺序 对数组 进行排序。 ( 我用粗体字指定了该名称,但最终还是被标记出来了,人们甚至都不在乎阅读该问题 ) 例如,我想有所有 绿色的 对象,那么所有的 蓝色 的人,然后将所有的 红色 的。最好的方法是什么? 使用 sort 函数可以做到这一点吗?在这种情况下会是什么情况? 问题答案: 您可以为所需订单取一个对象。 对于未知

  • 在将此标记为副本之前,请阅读到底部 我希望能够按照字母顺序对字符串数组(或基于一个字符串值的结构片)进行排序,但要基于自定义字母表或unicode字母。 大多数时候,人们建议使用支持不同预定义语言环境/字母表的拼贴器。(请参阅此Java答案),但对于这些语言环境捆绑包中不可用的稀有语言/字母表,可以做些什么? 我想使用的语言在Golangs的归类支持和可用的语言列表中不可用,所以我需要能够定义自定

  • 根据字典顺序和自定义顺序对字符串数组进行排序(一种排列形式)。这是代码: 问题是,当我对一些输入运行此命令时,输出是正确的,而对于其他输入,输出是不正确的。我一直在调试它,但没有找到错误。 编辑: 阿德里安娜正在玩英文字母表。当她玩完字母表后,她意识到她把字母的位置弄乱了。现在,给定一组单词,她想知道根据她制作的新字母表排序,这些单词的字典排序是什么。 换句话说,给定英语字母表E和一组单词S的排列

  • 问题内容: 我正在为我的通讯录应用程序实现排序功能。 我想排序一个。是一个包含四个字段的类:姓名,家庭电话,手机号码和地址。我想继续。 如何编写自定义排序功能来做到这一点? 问题答案: 这是有关订购对象的教程: Java教程-集合-对象排序 尽管我会举一些例子,但我还是建议你阅读它。 有多种排序方式。如果要定义自然的(默认)排序,则需要让实现。假设你想默认在上进行排序name,然后执行(为简单起见