我尝试从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'") }) })
(Analyzer polish
来自插件analysis-stempel
。)
关于Fielddata的Elasticsearch建议改变字段的类型
从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 - define custom letter order for sorting
更新2:
我测试了ElasticSearch版本5.6.5
,我认为它允许在规范化器中使用icu_collation(接受我的注释)。
答案 0 :(得分:1)
您很可能在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版本不稳定,并且可能生成错误的架构。它们非常适合实验,但绝对不适合生产环境。
答案 1 :(得分:1)