我正在使用 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_collation
token 过滤器,它将 token 转换为排序规则 key 。因此,您需要在 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")
)。
关于java - ElasticSearch - 定义用于排序的自定义字母顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45598424/