我开始使用hibernate-search-elasticsearch(5.8.2),因为似乎易于集成,它无需编写任何代码即可保持最新的Elasticsearch索引。这是一个很酷的库,但是我开始认为它实现的弹性搜索功能集很小。我正在使用不费力的脚本过滤器执行查询,该过滤器需要访问String字段,该字段在索引映射中的类型为“文本”,并且如果不启用字段数据就无法实现。但是我不太愿意启用它,因为它会消耗大量堆内存。这是我的情况下Elasticsearch团队建议采取的措施:
在启用字段数据之前,请考虑为什么将文本字段用于聚合,排序或在脚本中使用。这样做通常没有任何意义。
在索引之前分析文本字段,以便可以通过搜索new或york来找到类似New York的值。当您可能想要一个名为New York的存储桶时,此字段上的术语汇总将返回一个新的存储桶和一个纽约存储桶。
相反,您应该有一个用于全文本搜索的文本字段,以及一个为聚合启用doc_values的未分析的关键字字段,如下所示:
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"my_field": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
不幸的是,我找不到使用hibernate-search注释的方法。有人可以告诉我这是否可行,还是我必须迁移到香草elasticsearch lib而不使用任何包装程序?
答案 0 :(得分:2)
在当前版本的Hibernate Search中,您需要为此创建一个不同的字段(例如,同一字段不能有不同的风格)。请注意,无论如何,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;
它应使用doc值创建一个未分析的字段。然后,您需要参考myPropertyAggregation
字段进行汇总。
请注意,在将来的Search 6中,我们将在API中公开更多Elasticsearch功能。在Search 5中,API的设计考虑了Lucene,我们不会破坏它们。