13

次のようなマッピングがあります。

{
  "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 [タイプ [投稿] とのマッピングで [メンション] のフィールドが見つかりません];

また、スクリプト部分を に置き換えてみましたdoc['mentions.id'].value.length == 2。こちらもエラー

ネスト: ArrayIndexOutOfBoundsException[10];

mentionsオブジェクトサイズ 2 のレコードをクエリする方法は?

4

3 に答える 3

14

elasticsearch ガイドでは、オブジェクトの長さの代わりにsize()を使用することを推奨しています。だからこれを試してください:

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

ではごきげんよう。

于 2013-06-26T20:38:09.913 に答える
3

ElasticSearch は、あなたが考えるようにオブジェクトの配列を保存しません。代わりに、オブジェクト プロパティごとに複数の配列が格納されます。

そのため、代わりに「サブ配列」を使用する必要があります。

于 2015-04-13T14:51:31.677 に答える