1

我正在从 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显示的,但是这些字段在高级(由用户发送)中是未知的,所以我不能使用 perpend 映射

4

1 回答 1

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

希望这可以帮助。谢谢

于 2017-03-14T07:49:50.370 回答