使用 Elasticsearch 的 Hibernate Search 创建带有 .keyword 后缀的字段

Hibernate Search with Elasticsearch creating fields with .keyword suffix

我刚刚使用 hibernate search 5.8 和 ES 5.5 实现了 Hibernate Search 与 Elasticsearch 的集成。 我有几个专为排序而创建的字段,它们都称为[field]Sort.

当我在本地测试它时,我第一次让 Hibernate 创建索引时,它创建了这样的字符串排序字段:

nameSort -> text
nameSort.keyword -> keyword

我意识到我应该使用带后缀的字段进行排序。 但是,当我销毁我的 Elasticsearch 集群时,重新开始时,它没有创建后缀字段,它只是直接将排序字段创建为关键字。 我再次重新创建集群 5 次或更多次,但它再也没有创建后缀字段。

当我最终将更改发送到暂存环境时,它再次创建了后缀字段,导致我的查询失败,因为它们试图按文本字段而不是关键字字段进行排序。

现在,我真的不确定为什么它有时会创建后缀,有时却不会。 有什么规定吗? 有没有办法避免它创建 2 个字段并使其始终只创建一个与我给它的名称完全相同的关键字字段?

这是排序字段的示例:

@Field(name = "nameSort", analyze = Analyze.NO, store = Store.YES, index = Index.NO)
@SortableField(forField = "nameSort")
public String getNameSort() {
    return name != null ? name.toLowerCase(Locale.ENGLISH) : null;
}

在此先感谢您的帮助。

Hibernate Search 不会为文本字段创建单独的关键字字段。它创建文本字段或关键字字段,具体取决于是否应分析该字段。在你的例子中,该字段没有被分析,所以它应该创建一个关键字字段。

现在,Hibernate Search 并不孤单,这种行为可能源于 Elasticsearch 集群本身。您是否检查过您的 Elasticsearch 集群上是否有特定的索引模板?每当 Hibernate Search 创建文本 属性.

时,它可能会导致 Elasticsearch 创建关键字字段

附带说明一下,您可能对 Hibernate Search 5.8 允许定义规范化器(与 Elasticsearch 规范化器相同)这一事实感兴趣,这将允许您直接注释 getName() getter 并避免这样做小写转换自己。有关详细信息,请参阅 this blog post