2016-01-13 101 views
1

我試圖在滿足以下條件時從elasticsearch索引中提取數據。在彈性搜索查詢中使用兩個檢查

  1. stream_id是空字符串(例如, 「」)
  2. source_id是一個特定的字符串(例如, 「unknown_source」)

我可以單獨使用這兩個以下查詢: 對於檢查空字符串:

{ 
"query": { 
    "filtered": { 
    "filter": { 
     "script": { 
     "script": "_source.stream_id.length() == 0" 
     } 
    } 
    } 
} 
} 

檢查source_id

{ 
"query": { 
    "bool" : { 
    "must" : { 
     "term" : { "source_id" : "unknown_source" } 
    } 
    } 
} 
} 

但是現在我看到'過濾'查詢在ES 2.0版中已棄用,而且我使用的是版本2.1。那麼,我怎麼和這兩個條件?我看着到過濾查詢頁面的文檔,它說

使用布爾查詢,而不是與查詢和過濾器的過濾器 條款必須的條款。

所以,然後我試着下面的查詢,但它不工作。

{ 
"query": { 
    "bool": { 
    "must" : { 
     "term" : { "source_id" : "unknown_source" } 
    }, 
    "filter": { 
     "script": { 
      "script": "_source.stream_id.length() == 0" 
     } 
    } 
} 
} 
} 

回答

2

您可以用bool/mustfilter部分裏面做這樣的(因爲你不關心得分)

{ 
    "query": { 
    "bool": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "script": { 
       "script": "_source.stream_id.length() == 0" 
       } 
      }, 
      { 
       "term": { 
       "source_id": "unknown_source" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

,或者您也可以騰出兩個層面都已經記下來查詢上下文(即使你不關心評分)

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "script": { 
      "script": "_source.stream_id.length() == 0" 
      } 
     }, 
     { 
      "term": { 
      "source_id": "unknown_source" 
      } 
     } 
     ] 
    } 
    } 
} 
+0

第一個代碼得到一個錯誤,說'QueryParsingException [[apache_combined] [bool]查詢不支持[filter]]'。此外,我需要這兩個條件相匹配。 – Bitswazsky

+0

我的uri是'http:// localhost:9200/apache_combined/_search?fields = message'。第二個查詢會拋出一個錯誤,說'QueryParsingException [[apache_combined]沒有註冊[script]]的查詢; }]「,'我在elasticsearch.yml中添加了'script.disable_dynamic:false'條目 – Bitswazsky

+0

我已經更新了我的答案,例如'must'而不是'should',對此很抱歉,2.1中需要[啓用動態腳本](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html#enable-dynamic-scripting)with'script.inline:on' – Val