Hibernate Search:Fielddata 在文本字段上被禁用
Hibernate Search: Fielddata is disabled on text fields
我尝试从 Hibernate Search 5.8.0.CR1
升级到 5.8.2.Final
从 ElasticSearch 2.4.2
到 5.6.4
.
当我 运行 我的应用程序出现以下错误时:
Status: 400 Bad Request
Error message: {"root_cause":[{"type":"illegal_argument_exception",
reason":"Fielddata is disabled on text fields by default.
Set fielddata=true on [title] in order to load fielddata in memory by uninverting the inverted index.
Note that this can however use significant memory. Alternatively use a keyword field instead."}]
我在这里阅读了有关 Fielddata 的信息:
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/fielddata.html#_fielddata_is_disabled_on_literal_text_literal_fields_by_default
但我不确定如何解决这个问题,尤其是 Hibernate Search。
我的 title
字段定义如下所示:
@Field(name = "title", analyzer = @Analyzer(definition = "my_collation_analyzer"))
@Field(name = "title_polish", analyzer = @Analyzer(definition = "polish"))
protected String title;
我正在使用以下分析器定义:
@AnalyzerDef(name = "my_collation_analyzer",
tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class), filters = { @TokenFilterDef(
name = "polish_collation", factory = ElasticsearchTokenFilterFactory.class, params = {
@org.hibernate.search.annotations.Parameter(name = "type", value = "'icu_collation'"),
@org.hibernate.search.annotations.Parameter(name = "language", value = "'pl'") }) })
(分析器 polish
来自插件 analysis-stempel
。)
Elasticsearch notes on Fielddata 建议更改字段类型
从 text
到 keyword
,或设置 fielddata=true
,但我不确定
如何使用 Hibernate Search 注释来做到这一点,因为没有这样的
注释中的属性 @Field
.
更新:
非常感谢您对此的帮助。我将代码更改为:
@NormalizerDef(name = "my_collation_normalizer",
filters = { @TokenFilterDef(
name = "polish_collation_normalization", factory = ElasticsearchTokenFilterFactory.class, params = {
@org.hibernate.search.annotations.Parameter(name = "type", value = "'icu_collation'"),
@org.hibernate.search.annotations.Parameter(name = "language", value = "'pl'") }) })
...
@Field(name = "title_for_search", analyzer = @Analyzer(definition = "polish"))
@Field(name = "title_for_sort", normalizer = @Normalizer(definition = "my_collation_normalizer"))
@SortableField(forField = "title_for_sort")
protected String title;
可以吗?据我了解,规范化器中不应该进行标记化,但我不确定除了 @TokenFilterDef
和 factory = ElasticsearchTokenFilterFactory.class
(?).
还可以使用什么
不幸的是,我也遇到了以下错误:
Error message: {"root_cause":
[{"type":"illegal_argument_exception",
"reason":"Custom normalizer [my_collation_normalizer] may not use filter
[polish_collation_normalization]"}]
我需要排序规则,如我之前的问题所述:
更新二:
我测试了 ElasticSearch 版本 5.6.5
,我认为它允许 icu_collation 在规范化器中(我的注释被接受)。
您很可能在 Elasticsearch 集群中保留了旧模式,并尝试在 Elasticsearch 5 中使用它和 Hibernate Search。这行不通。
从 Elasticsearch 2 升级到 5 时,您必须采取一些步骤来升级 Elasticsearch 模式,以便将其与 Hibernate Search 一起使用。最简单的选择(到目前为止)是删除索引并重新索引整个数据库。您可以在文档中找到详细信息:https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#_upgrading_elasticsearch
请注意,如果您的 Elasticsearch 模式是从测试版的 Hibernate Search 生成的,您可能还需要删除索引并重新编制索引:测试版不稳定,可能会生成不正确的模式。它们非常适合实验,但绝对不适合生产环境。
如果您尝试对“标题”字段进行排序,那么您可能忘记了使用 @SortableField
注释将该字段标记为可排序。 (更多信息here) [EDIT: In Hibernate Search 6 you would use @KeywordField(sortable = Sortable.YES)
. See here]
此外,为避免错误并获得更好的性能,您应该考虑对要排序的字段(例如“标题”字段)使用规范器而不是分析器。这会将您的字段变成关键字字段,这就是 Elasticsearch 日志所暗示的内容。
我们提供了有关 Hibernate Search 中规范化器的更多信息here, and here 是 Hibernate Search 中的 Elasticsearch 细节。
我尝试从 Hibernate Search 5.8.0.CR1
升级到 5.8.2.Final
从 ElasticSearch 2.4.2
到 5.6.4
.
当我 运行 我的应用程序出现以下错误时:
Status: 400 Bad Request
Error message: {"root_cause":[{"type":"illegal_argument_exception",
reason":"Fielddata is disabled on text fields by default.
Set fielddata=true on [title] in order to load fielddata in memory by uninverting the inverted index.
Note that this can however use significant memory. Alternatively use a keyword field instead."}]
我在这里阅读了有关 Fielddata 的信息: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/fielddata.html#_fielddata_is_disabled_on_literal_text_literal_fields_by_default 但我不确定如何解决这个问题,尤其是 Hibernate Search。
我的 title
字段定义如下所示:
@Field(name = "title", analyzer = @Analyzer(definition = "my_collation_analyzer"))
@Field(name = "title_polish", analyzer = @Analyzer(definition = "polish"))
protected String title;
我正在使用以下分析器定义:
@AnalyzerDef(name = "my_collation_analyzer",
tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class), filters = { @TokenFilterDef(
name = "polish_collation", factory = ElasticsearchTokenFilterFactory.class, params = {
@org.hibernate.search.annotations.Parameter(name = "type", value = "'icu_collation'"),
@org.hibernate.search.annotations.Parameter(name = "language", value = "'pl'") }) })
(分析器 polish
来自插件 analysis-stempel
。)
Elasticsearch notes on Fielddata 建议更改字段类型
从 text
到 keyword
,或设置 fielddata=true
,但我不确定
如何使用 Hibernate Search 注释来做到这一点,因为没有这样的
注释中的属性 @Field
.
更新:
非常感谢您对此的帮助。我将代码更改为:
@NormalizerDef(name = "my_collation_normalizer",
filters = { @TokenFilterDef(
name = "polish_collation_normalization", factory = ElasticsearchTokenFilterFactory.class, params = {
@org.hibernate.search.annotations.Parameter(name = "type", value = "'icu_collation'"),
@org.hibernate.search.annotations.Parameter(name = "language", value = "'pl'") }) })
...
@Field(name = "title_for_search", analyzer = @Analyzer(definition = "polish"))
@Field(name = "title_for_sort", normalizer = @Normalizer(definition = "my_collation_normalizer"))
@SortableField(forField = "title_for_sort")
protected String title;
可以吗?据我了解,规范化器中不应该进行标记化,但我不确定除了 @TokenFilterDef
和 factory = ElasticsearchTokenFilterFactory.class
(?).
不幸的是,我也遇到了以下错误:
Error message: {"root_cause":
[{"type":"illegal_argument_exception",
"reason":"Custom normalizer [my_collation_normalizer] may not use filter
[polish_collation_normalization]"}]
我需要排序规则,如我之前的问题所述:
更新二:
我测试了 ElasticSearch 版本 5.6.5
,我认为它允许 icu_collation 在规范化器中(我的注释被接受)。
您很可能在 Elasticsearch 集群中保留了旧模式,并尝试在 Elasticsearch 5 中使用它和 Hibernate Search。这行不通。
从 Elasticsearch 2 升级到 5 时,您必须采取一些步骤来升级 Elasticsearch 模式,以便将其与 Hibernate Search 一起使用。最简单的选择(到目前为止)是删除索引并重新索引整个数据库。您可以在文档中找到详细信息:https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#_upgrading_elasticsearch
请注意,如果您的 Elasticsearch 模式是从测试版的 Hibernate Search 生成的,您可能还需要删除索引并重新编制索引:测试版不稳定,可能会生成不正确的模式。它们非常适合实验,但绝对不适合生产环境。
如果您尝试对“标题”字段进行排序,那么您可能忘记了使用 @SortableField
注释将该字段标记为可排序。 (更多信息here) [EDIT: In Hibernate Search 6 you would use @KeywordField(sortable = Sortable.YES)
. See here]
此外,为避免错误并获得更好的性能,您应该考虑对要排序的字段(例如“标题”字段)使用规范器而不是分析器。这会将您的字段变成关键字字段,这就是 Elasticsearch 日志所暗示的内容。
我们提供了有关 Hibernate Search 中规范化器的更多信息here, and here 是 Hibernate Search 中的 Elasticsearch 细节。