繁体   English   中英

休眠搜索:字段数据在文本字段上被禁用

[英]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 关于 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;

可以吗? 据我了解,在规范化器中不应该有标记化,但我不确定还可以使用什么来代替@TokenFilterDeffactory = ElasticsearchTokenFilterFactory.class (?)。

不幸的是,我也收到以下错误:

Error message: {"root_cause":
[{"type":"illegal_argument_exception",
"reason":"Custom normalizer [my_collation_normalizer] may not use filter
[polish_collation_normalization]"}]

我需要整理排序,如我上一个问题中所述: ElasticSearch - 定义用于排序的自定义字母顺序

更新 2:

我测试了 ElasticSearch 5.6.5版,我认为它允许在规范化器中使用 icu_collat​​ion(我的注释被接受)。

如果您尝试对“标题”字段进行排序,那么您可能忘记使用@SortableField注释将该字段标记为可排序。 (更多信息在这里) [编辑:在 Hibernate Search 6 中,您将使用@KeywordField(sortable = Sortable.YES) 这里]

此外,为了避免错误并获得更好的性能,您应该考虑对要排序的字段(例如“标题”字段)使用规范化器而不是分析器。 这会将您的字段变成关键字字段,这是 Elasticsearch 日志所暗示的。

有关 Hibernate Search 中规范化器的更多信息可在此处获得此处是 Hibernate Search 中的 Elasticsearch 细节。

您很可能在 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 的 Beta 版本生成的,您可能还必须删除索引并重新编制索引:Beta 版本不稳定,并且可能生成不正确的架构。 它们适用于实验,但绝对不适用于生产环境。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM