2017-09-22 100 views
0

我在AWS上使用elasticsearch存儲來自Cloudfront的日誌。我創建了一個簡單的查詢,這將使我從過去的24小時中的所有條目,從新排序老:如何根據字段的內容排除elasticsearch的結果?

{ 
    "from": 0, 
    "size": 1000, 
    "query": { 
    "bool": { 
     "must": [ 
     { "match": { "site_name": "some-site" } } 
     ], 
     "filter": [ 
     { 
      "range": { 
      "timestamp": { 
       "lt": "now", 
       "gte": "now-1d" 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "sort": [ 
    { "timestamp": { "order": "desc" } } 
    ] 
} 

現在,有一個一定的來源(基於用戶代理),爲此,我想排除結果。所以我的問題歸結爲:

如何從結果中篩選出某些字段包含某個字符串?或者:

query.filter.where('cs_user_agent').does.not.contain('Some string')

(這不是真正的代碼,很明顯)

我曾試圖讓Elasticsearch文檔的感覺,但我無法找到如何實現一個很好的例子。

我希望這是有道理的。提前致謝!

回答

1

好的,我想通了。我所做的是在組合使用布爾查詢使用通配符:

{ 
    "from": 0, 
    "size": 1000, 
    "query": { 
    "bool": { 
     "must": [ 
     { "match": { "site_name": "some-site" } } 
     ], 
     "filter": [ 
     { 
      "range": { 
      "timestamp": { 
       "lt": "now", 
       "gte": "now-1d" 
      } 
      } 
     } 
     ], 
     "must_not": [ 
     { "wildcard": { "cs_user_agent": "some string*" } } 
     ] 
    } 
    }, 
    "sort": [ 
    { "timestamp": { "order": "desc" } } 
    ] 
} 

這基本上匹配包含「一些字符串」任何用戶代理字符串,然後過濾出來(因爲「must_not」的)。

我希望這可以幫助其他人遇到這個問題。

+0

有沒有其他方式沒有使用通配符查詢?它似乎可以是緩慢的https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html –

+0

你不是在用你的配對嗎? –

+0

@SylvainAttoumani如果我嘗試你的建議,我會得到我不想看到的結果。不太清楚爲什麼。 – Sandyman

相關問題