1

私はElasticSearchを初めて使用し、ネストされたマッピング/クエリの使用に問題があります.

次のデータ構造がインデックスに追加されています。

{
   "_id": "3",
   "_rev": "6-e9e1bc15b39e333bb4186de05ec1b167",
   "skuCode": "test",
   "name": "Dragon vol. 1",
   "pages": [
       {
           "id": "1", 
           "tags": [
               {
                   "name": "dragon"
               },
               {
                   "name": "japonese"
               }
           ]
       },
       {
           "id": "2",               
           "tags": [
               {
                   "name": "tagforanotherpage"
               }
           ]
       }
   ]
}

このインデックス マッピングは次のように定義されます。

{
  "metabook" : {
    "metabook" : {
      "properties" : {
        "_rev" : {
          "type" : "string"
        },
        "name" : {
          "type" : "string"
        },
        "pages" : {
          "type" : "nested",
          "properties" : {
            "tags" : {
              "properties" : {
                "name" : {
                  "type" : "string"
                }
              }
            }
          }
        },
        "skuCode" : {
          "type" : "string"
        }
      }
    }
  }
}

私の目標は、特定のタグを含むすべてのページを検索し、フィルタリングされたページ リストを含む book オブジェクトを返すことです (指定されたタグに一致するページのみを ES に返してもらいたいです)。次のようなもの(2ページ目を無視):

{
   "_id": "3",
   "_rev": "6-e9e1bc15b39e333bb4186de05ec1b167",
   "skuCode": "test",
   "name": "Dragon vol. 1",
   "pages": [
       {
           "id": "1",               
           "tags": [
               {
                   "name": "dragon"
               },
               {
                   "name": "japonese"
               }
           ]
       }
   ]
}

私が実際に使用するクエリは次のとおりです。

{
"from": 0,
"size": 10,
"query" : {
    "nested" : {
        "path" : "pages",
        "score_mode" : "avg",
        "query" : {
           "term" : { "tags.name" : "japonese" }
       }
    }
  }
}

しかし、実際には空の結果が返されます。私は何を間違っていますか?本の代わりに「ページ」を直接インデックス化する必要があるかもしれません。何が欠けていますか?

前もって感謝します !

4

1 に答える 1

1

残念ながら、ドキュメントの一部だけを取り戻すことはできません。ドキュメントがクエリに一致する場合、すべてが返されます。ルートおよびネストされたすべてのドキュメント。パーツのみを取得したい場合は、親/子ドキュメントの使用を検討できます。

また、ネストされたクエリに小さな構文エラーがあるため、ヒットが表示されません。フィールド名をよく見てください。

{
"from": 0,
"size": 10,
"query" : {
    "nested" : {
        "path" : "pages",
        "score_mode" : "avg",
        "query" : {
           "term" : { "pages.tags.name" : "japonese" }
       }
    }
  }
}

親子ドキュメントのヘルプが必要な場合は、お気軽にお問い合わせください。(グーグル検索すれば実例が出てくるはず)

幸運を!

于 2013-07-23T21:37:50.380 に答える