2016-07-23 11 views
0

ElasticSearchのネストされたオブジェクトを検索しようとしています。ElasticSearchがネストされたオブジェクトを照会することが期待通りに機能しない

私は、次のコマンドを実行します -

POST /demo/person/1 
{ 
    "children": [{ 
     "fullName" : "Bob Smith", 
     "gender": "M" 
    }] 
} 

ユーザー文書を追加インデックスおよびマッピング

PUT /demo 
{ 
    "mappings": { 
     "person": { 
      "properties": { 
       "children": { 
        "type": "nested", 
         "properties": { 
          "fullName": { 
           "type": "string" 
          }, 
          "gender": { 
           "type": "string", 
           "index": "not_analyzed" 
         } 
        } 
       } 
      } 
     } 
    } 
} 

を作成して期待通りにこれらのすべての実行されます。しかし、私がdocumentationに概説されているようにそれらを検索すると、何の結果も得られません。

クエリ

POST /demo/person/_search 
{ 
    "query": { 
     "bool": { 
      "must": [{ 
       "match_all": {} 
      }, 
      { 
       "nested": { 
       "path": "children", 
       "query": { 
        "bool": { 
         "must": [{ 
          "match": { 
           "fullName": "Bob Smith" 
          } 
         }] 
        } 
       } 
       } 
      }] 
     } 
    } 
} 

私が間違って何をしているのですか?

+3

あなたはfullNameでマシニングしていますが、このフィールドはLucene内にchildren.fullNameとして保存されています。 children.fullName :)に変更してください。 –

+1

@WaldemarNeto - ありがとうございました。 – baynezy

答えて

1

回答を記録するには、すべてのクエリとフィルタに完全なフィールド名が必要です。上記の例では、文書がインデックスされる:

{ 
    "children": [ 
    { 
     "fullName" : "Bob Smith", 
     "gender": "M" 
    } 
    ] 
} 

genderを照会するために、children.genderとしてアクセスしなければならないとfullNameを照会し、それがchildren.fullNameとして照会されなければなりません。

"children.fullName": [ "Bob Smith", "Jane Smith" ] 
"children.gender": [ "M", "F" ] 

{ 
    "children": [ 
    { 
     "fullName" : "Bob Smith", 
     "gender": "M" 
    }, 
    { 
     "fullName" : "Jane Smith", 
     "gender": "F" 
    } 
    ] 
} 

objectタイプ(デフォルト)でこれを次のようになります。

すべてのJSONデータ構造を効果的に実際にそうnestedタイプも存在している全体の理由、であるLuceneと、によって平坦化されています

nestedタイプと、それは次のようになります。

{ 
    "children.fullName": [ "Bob Smith" ] 
    "children.gender": [ "M" ] 
} 
{ 
    "children.fullName": [ "Jane Smith" ] 
    "children.gender": [ "F" ] 
} 

ここで、{}は、ネストされたドキュメントの境界として機能します(実際には存在しませんが、論理的にはそれらです)。

このように、ネストされたドキュメントを使用しているかどうかにかかわらず、最後の部分(例:gender)がインデックスに固有であっても、フィールド名への完全なパスを指定する必要があります。

アレイ内に1つのオブジェクトしかない場合は、nestedタイプを使用しないでください。実際に配列として使用する場合にのみ便利です。配列でない場合、フラット・バージョンはオーバーヘッドが少なく、まったく同じ機能を果たします。ドキュメントの中には単一のものがいくつかありますが、複数のものがある場合は、nestedを使用することも意味があります。

関連する問題