2017-07-25 44 views
0

我正在將數據存儲在elasticsearch數據庫中,並試圖查詢它,並按數字範圍進行過濾。使用範圍過濾器和內部字段的未知名稱在Elasticsearch中嵌套搜索查詢

這是最小化的文檔的結構在我的數據庫:

"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」的子場中至少一個數字範圍在2和4之間。重要的是,我不知道「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的第一個解決方案簡短而強大。

相關問題