2016-08-08 4 views
0

私は、配列フィールドにネストされたブールフィールドと文字列フィールドのクエリに関する非常に特別な問題があります。インデックスマッピングは以下の通りである:配列フィールドのBoolクエリ

indexes :string_field_1, type: 'string' 
indexes :string_field_2, type: 'string' 
indexes :boolean_field_1, type: 'boolean' 
indexes :array_field_1 do 
      indexes :boolean_field_2, type: 'boolean' 
      indexes :string_field_3, type: 'string' 
end 
indexes :array_field_2 do 
      indexes :integer_field_1, type: 'integer' 
end 
indexes :array_field_3 do 
      indexes :integer_field_2, type: 'integer' 
end 

文書指数も配列フィールドにネストされていない他の多くの分野がありますが、クエリフィールドの中に含まれる必要があります。 私は以下の通りであるフィルタとブールクエリを使用してのアプローチを試してみました:

"query": 
     {"bool": 
       {"must": 
         [ 
           {"query_string": 
             {"query":"text which is being searched", 
             "fields":[ 
               "string_field_1", 
               "string_field_2", 
               "array_field_1.string_field_3" 
               ], 
             "fuzziness":"1","analyze_wildcard":true,"auto_generate_phrase_queries":false,"analyzer":"brazilian","default_operator":"AND"} 
           } 
         ], 
         "filter":[ 
           {"bool": 
             {"must": 
               [ 
                 {"bool": 
                   {"should": 
                     [ 
                       {"term":{"boolean_field_1":false}}, 
                       {"terms":{"array_field_2.integer_field_1":[x,z]}}, 
                       {"term":{"array_field_3.integer_field_2":y}}]}}, 
                 {"bool": 
                   {"should": 
                     [ 
                       {"term":{"array_field_1.boolean_field_2":true}}, 
                       {"terms":{"array_field_2.integer_field_1":[x,z]}}, 
                       {"term":{"array_field_3.integer_field_2":y}}]}}, 
                     ] 
                   } 
                 } 
               ] 
             } 
           } 
         ] 
       } 
} 

このクエリでの問題は、それが私の意見では、返される必要はありません、ドキュメントを返しているということです。 文書は、この場合には、怒鳴るです:偽も検索されているテキスト:

_source": { 
    "string_field_1": "text 1", 
    "string_field_2": "text 2", 
    "boolean_field_1": false, 
    "array_field_1": [ 
     { 
      "boolean_field_2": true, 
      "string_field_3": "some text which is not being searched" 
     }, 
     { 
      "boolean_field_2": true, 
      "string_field_3": "some text which is not being searched" 
     }, 
     { 
      "boolean_field_2": false, 
      "string_field_3": "text which is being searched" 
     }, 
     { 
      "boolean_field_2": true, 
      "string_field_3": "some text which is not being searched" 
     } 
    ], 
    "array_field_2": [ 
     { 
      "integer_field_1": A 
     } 
    ], 
    "array_field_3": [ 
     { 
      "integer_field_2": B 
     } 
    ] 
} 

あなたはお気づきのように、array_field_1の3番目の項目はboolean_field_2が含まれています。しかし、私のfilter:節によると、array_field_1.boolean_field_2が真であるドキュメントだけが検索されなければなりません。なぜなら、array_field_2.integer_field_1:またはarray_field_3.integer_field_1が発生しない限り、これは真ではありません。 論理的には、array_field_1 [2]がboolean_field_2がfalseであるとは考えていないようです。 このドキュメントが取得されないようにクエリを作成するにはどうすればよいですか?

おかげで別のアプローチは、ブール型のフィールドに関連するブールクエリと一緒にarray_field_1.string_field_3クエリを置くことで構成され、 ギリェルメ

答えて

0

進歩である:

"query":{ 
    "bool":{ 
     "should": 
     [ 
      { 
       "query_string": 
        { 
         "query":"text which is being searched", 
         "fields": 
          [ 
           "string_field_1", 
           "string_field_2" 
          ], 
          "fuzziness":"1","analyze_wildcard":true,"auto_generate_phrase_queries":false,"analyzer":"brazilian","default_operator":"AND" 
        } 
      }, 
      { 
       "bool":{ 
        "must": 
        [ 
         { 
          "query_string": 
          { 
           "query":"text which is being searched", 
           "fields":["array_field_1.string_field_3"], 
           "fuzziness":"1","analyze_wildcard":true,"auto_generate_phrase_queries":false,"analyzer":"brazilian","default_operator":"AND" 
          } 
         }, 
         { 
          "bool":{ 
           "should": 
           [ 
            {"term":{"array_field_1.boolean_field_2":true}}, 
            {"terms":{"array_field_2.integer_field_1":[x,z]}}, 
            {"term":{"array_field_3.integer_field_2":y}} 
           ] 
          } 
         } 
        ] 
       } 
      } 
     ], 
     "filter": 
     [ 
      { 
       "bool":{ 
        "should": 
        [ 
         {"term":{"boolean_field_1":false}}, 
         {"terms":{"array_field_2.integer_field_1":[x,z]}}, 
         {"term":{"array_field_3.integer_field_2":y}} 
        ] 
       } 
      } 
     ] 
    } 
} 

このクエリはまた、残念ながら、文書を取得。私は本当にこのクエリを適切に構築する方法を知らない。

上記のように編成されるクエリ: (X)または(A AND(B OR C OR D))であった

0

私の解決策:

"query":{ 
    "bool":{ 
     "should": 
     [ 
      { 
       "query_string": 
        { 
         "query":"text which is being searched", 
         "fields": 
          [ 
           "string_field_1", 
                 "string_field_2" 
          ], 
          "fuzziness":"1","analyze_wildcard":true,"auto_generate_phrase_queries":false,"analyzer":"brazilian","default_operator":"AND" 
        } 
      }, 
      { 
       bool: { 
            should:[ 
             { 
              query:{ 
               nested: { 
                path: 'array_field_1', 
                query: { 
                 bool: { 
                  must: [ 
                   { match: { "array_field_1.string_field_3": "text which is being searched"} }, 
                   {term: {"array_field_1.boolean_field_2": true}} 
                  ] 
                 } 
                } 
               } 
              } 
             }, 
             { 
              bool: 
              { 
              must: [ 
              { 
                query:{ 
                 nested: { 
                  path: 'movimentos', 
                  query: { 
                   bool: { 
                    must: [ 
                     { match: { "array_field_1.string_field_3": "text which is being searched"} }, 
                     {term: {"array_field_1.boolean_field_2": false 
                    ] 
                   } 
                  } 
                 } 
                } 
               }, 
               { 
                query: { 
                bool: { 
                  should: [ 
                   {"terms":{"array_field_2.integer_field_1":[x,z]}}, 
                   {"term":{"array_field_3.integer_field_2":y}} 
                  ] 
                 } 
                 } 
               } 
               ] 
              } 
             } 
            ] 
           } 
     } 
    ] 
    } 
} 
関連する問題