【问题标题】:RemoteTransportException, Fielddata is disabled on text fields when doing aggregation on text fieldRemoteTransportException,在文本字段上进行聚合时,字段数据在文本字段上被禁用
【发布时间】:2017-03-15 09:10:02
【问题描述】:

我正在从 2.x 迁移到 5.x 我正在像这样向索引添加值

indexInto (indexName / indexType) id someKey source foo

但是我也想按字段获取所有值:

 def getValues(tag: String) ={
client execute {
search(indexName / indexType) query ("_field_names", tag) aggregations (termsAggregation( "agg") field tag size 1)
}

但我得到了这个例外:

RemoteTransportException[[8vWOLB2][172.17.0.5:9300][indices:data/read/search[phase/query]]]; 嵌套:IllegalArgumentException [Fielddata 在文本字段上被禁用 默认。在 [my_tag] 上设置 fielddata=true 以加载 fielddata 通过反转倒排索引在内存中。请注意,这可以 但是使用大量内存。];

我想也许可以使用keyword,如图所示here,但是这些字段在高级(由用户发送)中是未知的,所以我不能使用挂起映射

【问题讨论】:

    标签: scala elasticsearch elastic4s


    【解决方案1】:

    默认情况下,所有未知字段都将作为未在映射中指定的文本字段被索引/添加到 elasticsearch。 如果您查看此类字段的映射,您会看到为此类字段启用了“关键字”类型的字段,并且这些字段已编入索引但未进行分析。

    GET new_index2/_mappings
    {
      "new_index2": {
        "mappings": {
          "type": {
            "properties": {
              "name": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          }
        }
      }
    }
    

    因此您可以将文本字段的字段值用于聚合,如下所示

    POST new_index2/_search
    {
      "aggs": {
        "NAME": {
          "terms": {
            "field": "name.fields",
            "size": 10
          }
        }
      }
    }
    

    查看name.fields

    因此,如果您可以转移到字段值,您的 scala 查询就可以工作。

    def getValues(tag: String) = {
       client.execute {
          search(indexName / indexType)
            .query("_field_name", tag)
            .aggregations {
               termsAgg("agg", "field_name.fields")
            }.size(1)
       }
    }
    

    希望这会有所帮助。 谢谢

    【讨论】:

    • 谢谢,我觉得映射方法应该是PUT吧?我还应该添加分析器吗?
    • mapping 伴随着设置,我的回答是为已经创建的索引获取映射。它是每个索引的映射端点,以获取与其关联的所有类型和映射
    • 分析器,我不认为你需要添加分析器。该字段是在索引中动态创建的,我没有为该字段定义任何映射,因为您提到“字段事先不知道”。所以这是指如果你没有在你的架构设置中定义映射的样子
    • 如果我错了,请纠正我,但在您的示例中,我需要在高级字段中添加映射,我的问题是字段名称仅在运行时已知。
    • 是的,你是对的。如果您不向字段添加映射,则默认情况下将为该字段添加这些映射 { "new_index2": { "mappings": { "type": { "properties": { "name": { "type" :“文本”,“字段”:{“关键字”:{“类型”:“关键字”,“ignore_above”:256 } } } } } } }。您不必自己添加它们。您只需要在聚合时使用 .fields。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2015-07-17
    • 2018-04-02
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多