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")
)。
我正在使用 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")
)。