2017-07-25 9 views
0

私はelasticsearchデータベースにデータを格納しており、数値の範囲でフィルタリングしてクエリを実行しようとしています。範囲フィルタと内部フィールドの不明な名前を持つElasticsearchのネストされた検索クエリ

これは私のデータベース内の文書の構造を最小化する:範囲内の1つの数は、少なくとも、「B」のサブフィールドのいずれかに存在する場合に

"a": { 
    "b": { 
     "x": [1, 2, 3, 4], // note: x, y and z are not compulsory 
     "y": [2, 3, 4], // some documents can have only x or z or maybe x and z etc. 
     "z": [5, 6] 
    } 
} 

は、今私は、私のクエリは、すべてのドキュメントを返すようにしたいですここで重要なのは、 "b"のすべてのサブフィールドの名前がわからないことです。

私が思いついたクエリは次のとおりです。

POST /i/t/_search 
{ 
    "query": { 
     "query_string": { 
      "fields": ["a.b.*"], 
      "query": "number:[2 TO 4]" 
     }   
    } 
} 

クエリがエラーに上昇するだけでなく、何も結果を返しません。私は実際にはわかりませんが、どのような種類の検索クエリもそのようなタスクに最も適しています。クエリ文字列は、未知のフィールド名と範囲に参加できる場所で見つかった唯一の文字列なので、クエリ文字列を使用しました。

答えて

0

クエリでnumber:を削除するようにしてください:

{ 
    "query": { 
     "query_string": { 
      "fields": ["a.b.*"], 
      "query": "[2 TO 4]" 
     }   
    } 
} 

オプションcount:[2 TO 4]docs)をしてみてください

フィールドパスに使用*ワイルドカードを許可するクエリの別のタイプがMulti Match Queryですが、正直なところ、私は表示されませんあなたのケースで数値範囲と組み合わせる方法。私の心に来る唯一の事は:

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "multi_match": { 
       "query": "2", 
       "fields": ["a.b.*"] 
      } 
      }, 
      { 
      "multi_match": { 
       "query": "3", 
       "fields": ["a.b.*"] 
      } 
      }, 
      { 
      "multi_match": { 
       "query": "4", 
       "fields": ["a.b.*"] 
      } 
      } 
     ] 
    } 
    } 
} 

...かなり醜いです。 query_stringを使用した最初のソリューションは短く強力です。

関連する問題