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

时间:2018-08-16 12:58:20

标签: java elasticsearch hibernate-search

我开始使用hibernate-search-elasticsearch(5.8.2),因为似乎易于集成,它无需编写任何代码即可保持最新的Elasticsearch索引。这是一个很酷的库,但是我开始认为它实现的弹性搜索功能集很小。我正在使用不费力的脚本过滤器执行查询,该过滤器需要访问String字段,该字段在索引映射中的类型为“文本”,并且如果不启用字段数据就无法实现。但是我不太愿意启用它,因为它会消耗大量堆内存。这是我的情况下Elasticsearch团队建议采取的措施:

Fielddata documentation

  

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

     

在索引之前分析文本字段,以便可以通过搜索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而不使用任何包装程序?

1 个答案:

答案 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,我们不会破坏它们。