关于java:Hibernate Search:在文本字段上禁用了字段数据

Hibernate Search: Fielddata is disabled on text fields

我尝试从Hibernate Search 5.8.0.CR1升级到5.8.2.Final
并从ElasticSearch 2.4.25.6.4

运行我的应用程序时,出现以下错误:

1
2
3
4
5
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/zh-CN/elasticsearch/reference/5.6/fielddata.html#_fielddata_is_disabled_on_literal_text_literal_fields_by_default
但是我不确定如何解决此问题,尤其是从Hibernate Search中解决问题。

我的title字段定义如下:

1
2
3
@Field(name ="title", analyzer = @Analyzer(definition ="my_collation_analyzer"))
@Field(name ="title_polish", analyzer = @Analyzer(definition ="polish"))
protected String title;

我正在使用以下分析器定义:

1
2
3
4
5
@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。)

关于Fielddata的Elasticsearch注释建议更改字段的类型
textkeyword,或设置fielddata=true,但我不确定
如何使用Hibernate Search注释执行此操作,因为没有这样的注释
注释@Field

中的属性

更新:

非常感谢您的帮助。我将代码更改为此:

1
2
3
4
5
6
7
8
9
10
11
@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(?)。

不幸的是,我还遇到以下错误:

1
2
3
4
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批注将该字段标记为可排序。 (更多信息在这里)

此外,为避免错误和提高性能,您应该考虑对要排序的字段(例如" title"字段)使用规范化器而不是分析器。这会将您的字段变成关键字字段,这是Elasticsearch日志所提示的内容。

有关Hibernate Search中规范化器的更多信息,请参见此处,这是Hibernate Search中Elasticsearch的详细信息。


您很可能将旧模式保留在Elasticsearch集群中,并尝试在带有Hibernate Search的Elasticsearch 5中使用它。这将不起作用。

从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版不稳定,并且可能会生成不正确的架构。它们非常适合用于实验,但绝对不适用于生产环境。