使用带有.keyword后缀

时间:2017-09-07 14:40:05

标签: java hibernate elasticsearch hibernate-search elasticsearch-5

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

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

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;
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Hibernate Search不会为文本字段创建单独的关键字字段。它会创建文本字段或关键字字段,具体取决于是否应分析字段。在您的情况下,该字段不会被分析,因此它应该创建一个关键字字段。

现在,Hibernate Search并不是唯一的,这种行为可能源于Elasticsearch集群本身。您是否检查过Elasticsearch集群上是否有特定的索引模板?每当Hibernate Search创建文本属性时,它都可能导致Elasticsearch创建关键字字段。

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