按对象类型字段弹性搜索的大小搜索

时间:2013-06-26 07:33:55

标签: elasticsearch

我有这样的映射:

{
  "post": {
    "properties": {
      "author_gender": {
        "type": "string",
        "index": "not_analyzed",
        "omit_norms": true,
        "index_options": "docs"
      },
      "author_link": {
        "type": "string",
        "index": "no"
      },
      "content": {
        "type": "string"
      },
      "mentions": {
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "profile_image_url": {
            "type": "string"
          },
          "screen_name": {
            "type": "string"
          }
        }
      }
   }
}

我需要搜索mentions对象的大小。我试过这个:

{
  "filter": {
    "script": {
      "script": "doc['mentions'].values.length == 2"
    }
  }
}

这不起作用。给出错误

  

嵌套:ElasticSearchIllegalArgumentException [找不到任何字段   [提及]用类型[post]]进行映射;

我还尝试用doc['mentions.id'].value.length == 2替换脚本部分。这也是错误的

  

nested:ArrayIndexOutOfBoundsException [10];

如何查询mentions对象大小为2的记录?

2 个答案:

答案 0 :(得分:13)

elasticsearch指南建议对对象使用 size() 而不是 length 。所以试试这个:

{
 "filter": {
   "script": {
     "script": "doc['mentions.id'].values.size() == 2"
    }
  }
}

一切顺利。

答案 1 :(得分:3)

ElasticSearch不会像您想象的那样存储对象数组。而是为每个对象属性存储多个数组。

这就是为什么你必须使用" sub array"代替。