弹性搜索中数组的重要术语聚合

时间:2017-05-26 23:33:26

标签: javascript arrays elasticsearch

我无法使用作为数组的字段执行重要的术语聚合。我的Javascript查询如下所示:

client.search({
  index: myIndex,
  body: {
    query: {
      terms: {
        myField: ['someuserid']
        // also tried with same result... myField: 'someuserid'
      }
    },
    aggregations: {
      recommendations: {
        significant_terms: {
          field: "myField",
          min_doc_count: 1
        }
      }
    }
  }
})

我收到此错误:

(node:13105) UnhandledPromiseRejectionWarning: Unhandled promise rejection 
(rejection id: 1): Error: [illegal_argument_exception] Fielddata is disabled 
on text fields by default. Set fielddata=true on [myField] in order to 
load fielddata in memory by uninverting the inverted index. Note that this can 
however use significant memory.

我的映射如下所示:

{
  index: 'myIndex',
  type: 'users',
  body: {
    properties: {
        'myField': []
    }
  }
}

我知道我不需要显式地映射数组数据类型,但是我这样做,所以我可以很容易地看到我对某个type的字段。在错误消息之后,我将我的映射更改为:

...
properties: {
  myField: {
    fielddata: "true"
  }
}
...

但是,这会导致此错误:

Error: [mapper_parsing_exception] No type specified for field [myField]

如果我要添加一个类型:     ...     属性:{       myField:{         类型:[],         fielddata:" true"       }     }     ... 我会得到这个错误:

[mapper_parsing_exception] No handler for type [[]] declared on field [myField]

目前,我正在聚合的数据来自完全使用由此构建的Update API通过Javascript客户端库播种的数据:

const update = {
    "upsert": {
      "myField": ['myValue']
    },
    "script": {
    "inline": "ctx._source.myField.add(params.itemField)",
    "params": {
      "itemField": 'itemValue'
    }
  }
};

const req = {
    index: 'myIndex',
    type: 'users',
    id: 'someuserid',
    body: update
}

此查询curl -XGET 'localhost:9200/myIndex/users/_search?pretty'的匹配将如下所示:

...
{
    "_index" : "myIndex",
    "_type" : "users",
    "_id" : "someuserid",
    "_score" : 1.0,
    "_source" : {
      "myField" : [
        "someFieldId1",
        "someFieldId1",
        "someFieldId2"
      ]
    }
  },
...

如何使用数组字段正确执行重要的术语聚合?

1 个答案:

答案 0 :(得分:1)

https://www.elastic.co/guide/en/elasticsearch/reference/current/array.html

  

在Elasticsearch中,没有专用的数组类型。任何领域都可以   默认情况下包含零个或多个值,但是,中包含所有值   数组必须具有相同的数据类型。

假设您使用的是ElasticSearch 5.x,请尝试将键入:[] 更改为键入:“text”键入:“keyword”

对于两者之间的区别,我建议您阅读:https://www.elastic.co/guide/en/elasticsearch/reference/current/text.html

但是在你的情况下,因为它看起来像某种id,它可能不需要分析,所以我建议使用“keyword”而不是“text”。

对于以前版本的ES,请改用“string”。 https://www.elastic.co/guide/en/elasticsearch/reference/2.4/string.html