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

时间:2017-03-14 07:04:11

标签: scala elasticsearch elastic4s

我正在从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] [指数:数据/读取/搜索[相位/查询]]];   嵌套:IllegalArgumentException [在文本字段上禁用Fielddata   默认情况下。在[my_tag]上设置fielddata = true以加载fielddata   在内存中通过反转指数。请注意,这可以   然而,使用重要的记忆。];

我认为可能使用keywordhere所示,但这些字段在高级中不知道(由用户发送),所以我不能使用perpend映射

1 个答案:

答案 0 :(得分:1)

默认情况下,所有未知字段都将作为未在映射中指定的文本字段编入索引/添加到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)
   }
}

希望这会有所帮助。 感谢