RemoteTransportException,在文本字段上进行聚合时在文本字段上禁用 Fielddata

RemoteTransportException, Fielddata is disabled on text fields when doing aggregation on text field

我正在从 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]]]; nested: IllegalArgumentException[Fielddata is disabled on text fields by default. Set fielddata=true on [my_tag] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.];

我被认为可以使用 keyword 如图所示 here ,但是这些字段在高级(由用户发送)中是未知的所以我不能使用 perpend 映射

默认情况下,所有未知字段都将 indexed/added 作为映射中未指定的文本字段发送到 elasticsearch。 如果您查看此类字段的映射,您会看到为类型为 'keyword' 的此类字段启用了一个字段,并且这些字段已编入索引但未分析。

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)
   }
}

希望这对您有所帮助。 谢谢