【问题标题】:Specifying keyword type on String field在字符串字段上指定关键字类型
【发布时间】:2018-08-16 12:58:20
【问题描述】:

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

Fielddata documentation

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

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

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

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

不幸的是,我找不到使用 hibernate-search 注释的方法。有人可以告诉我这是否可行,或者我必须迁移到 vanilla elasticsearch 库而不使用任何包装器?

【问题讨论】:

    标签: java elasticsearch hibernate-search


    【解决方案1】:

    使用当前版本的 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;
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 2019-10-07
      • 1970-01-01
      • 2021-11-26
      相关资源
      最近更新 更多