在字符串字段上指定关键字类型



我开始使用hibernate-search-elasticsearch(5.8.2(,因为它似乎很容易集成,它无需编写任何代码即可保持elasticsearch索引的最新状态。这是一个很酷的库,但我开始认为它实现了非常小的一组 elasticsearch 功能。我正在使用无痛脚本过滤器执行查询,该过滤器需要访问字符串字段,该字段在索引映射中为"文本",如果不启用字段数据,这是不可能的。但我不太热衷于启用它,因为它消耗了大量的堆内存。以下是 elasticsearch 团队在我的情况下建议做的事情:

现场数据文档

在启用字段数据之前,请考虑为什么使用文本字段进行聚合、排序或在脚本中使用。这样做通常没有意义。

在编制索引之前分析文本字段,以便可以通过搜索 new 或 york 找到像 New York 这样的值。此字段上的术语聚合将返回一个新存储桶和一个约克存储桶,而您可能想要一个名为 New York 的存储桶。

相反,您应该有一个用于全文搜索的文本字段,以及一个未分析的关键字字段,并为聚合启用了doc_values,如下所示:

PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"my_field": { 
"type": "text",
"fields": {
"keyword": { 
"type": "keyword"
}
}
}
}
}
}
}

不幸的是,我找不到使用休眠搜索注释的方法。有人可以告诉我这是否可能,或者我必须迁移到原版 elasticsearch 库而不使用任何包装器吗?

使用当前版本的Hibernate搜索,您需要为此创建一个不同的字段(例如,您不能对同一字段使用不同的风格(。请注意,这就是Elasticsearch在引擎盖下所做的。

@Field(analyzer = "your-text-analyzer") // your default full text search field with the default name
@Field(name="myPropertyAggregation", index = Index.NO, normalizer = "keyword")
@SortableField(forField = "myPropertyAggregation")
private String myProperty;

它应该创建一个带有文档值的未分析字段。然后,您需要引用聚合的myPropertyAggregation字段。

请注意,我们将在未来的 Search 6 中在 API 中公开更多的 Elasticsearch 功能。在搜索 5 中,API 在设计时考虑了 Lucene,我们无法破坏它们。

最新更新