2

ネストされたすべてのオブジェクトがいくつかの基準に一致するドキュメントのみをelasticsearchに返す方法はありますか? 次の不自然な例があるとします。

"mappings": {                                                                                                                                                            
  "person": {                                                                                                                                                            
    "properties": {                                                                                                                                                      
      "name": { "type": "string" },                                                                                                                                       
      "other_info": ...                                                                                                                                                  

      "pet": {                                                                                                                                                      
        "type": "nested",                                                                                                                                                 
        "properties": {                                                                                                                                                  
          "gender": { "type": "string" },                                                                                                                                 
          "age": { "type": "integer" },                                                                                                                                   
          "name": { "type": "string" },                                                                                                                                   
          "other_info": ...                                                                                                                                              
        }                                                                                                                                                                
      }                                                                                                                                                                  
    }                                                                                                                                                                    
  }                                                                                                                                                                      
}    

この場合、5 歳以上のペットを飼っている人をどのように検索すればよいでしょうかペットに関係のない他のプロパティも検索したいのですが、簡単にするために、そうでないと仮定しましょう。ある人が 3 匹のペットを飼っていて、そのうちの 1 匹か 2 匹だけが 5 歳以上である場合、検索ヒットとして表示されたくありません。


これを行う方法について何も見つけることができなかったので、あまり好きではない別の解決策を検討しました。ネストされたドキュメントを使用する代わりに、ペット用に個別のインデックスを作成し、人物 ID をプロパティとして (おそらく_parentフィールドを使用して) 使用します。次に、次のことができます。

  • 5 歳以上のペットを検索し、結果としてペットのリストを取得する
  • アプリケーション側では、リスト内のペットを人物 ID でグループ化します
  • 各グループのペットの数を数え、その人が所有するペットの総数と一致する場合は、その人の ID をリストに追加します
  • ID に基づいて個人のインデックスで別の検索を行い、確認したいその他の個人固有のプロパティを実行します。

これは非常に回りくどい方法のように思えますが、もし私がそのルートに行った場合、個人のインデックスを照会する前に、各個人が所有するペットの総数を知る必要があります (各ペットのプロパティとして保存するのと同じですが、または、少なくとも 1 匹の一致するペットを持つすべての人を検索し、ペットの数を事前に人物インデックスに保存して (またはスクリプト フィルターを使用して)、数が一致するかどうかを確認します。

この github の問題(「ヒットごとに一致するネストされた内部オブジェクトを返す」機能を追加する)に遭遇しましたが、これは非常に便利でしたが、残念ながらまだ実装されていません。

確かにこれを行うためのより良い方法はありますか?

4

1 に答える 1

9

must_not句を使用しない理由。私があなただったら、5 歳未満のペットを飼っている人を検索する句を含むboolフィルターで組み合わせて、5 歳以上のペットを飼っている人を検索します。must_not

このような:

"filter" : {
    "bool" : {
        "must" : {
            "nested" : {
                "path" : "person.pet",
                "filter" : {
                    "range" : {
                        "person.pet.age" : { "from" : 5 }
                    }
                } 
            }
        },
        "must_not" : {
            "nested" : {
                "filter" : {
                    "range" : {
                        "person.pet.age" : { "lte" : 5 }
                    }
                } 
            }
        }
    }
}

私がここで行っていることは、最初に 5 歳以上のペットを少なくとも 1 匹飼っているすべての人を取得することです (これには、複数のペットを飼っている人が含まれ、その中には若い人もいます)。次に、5 歳以下のペットを飼っているすべての人を除外し、望ましい結果を残します。

幸運を!

于 2013-09-18T08:35:29.117 に答える