2013-10-10 26 views
0

我想我已經想通了Elasticsearch,但我懷疑我沒能神交的東西,因此這個問題:我沒有從我的elasticsearch查詢中獲取任何文檔。有人能指出我的錯誤嗎?

我索引的產品,其中有場數量龐大,但有問題的是:

{ 
    "show_in_catalogue": { 
    "type": "boolean", 
    "index": "no" 
    }, 
    "prices": { 
    "type": "object", 
    "dynamic": false, 
    "properties": { 
     "site_id": { 
     "type": "integer", 
     "index": "no" 
     }, 
     "currency": { 
     "type": "string", 
     "index": "not_analyzed" 
     }, 
     "value": { 
     "type": "float" 
     }, 
     "gross_tax": { 
     "type": "integer", 
     "index": "no" 
     } 
    } 
    } 
} 

我試圖返回的所有文件,其中「show_in_catalogue」是真實的,並且存在與SITE_ID 1價格:

{ 
    "filter": { 
    "term": { 
     "prices.site_id": "1", 
     "show_in_catalogue": true 
    } 
    }, 
    "query": { 
    "match_all": {} 
    } 
} 

這將返回結果爲零。我還嘗試了兩個單獨的術語「和」過濾器 - 沒有運氣。

的文件之一的子集返回,如果我沒有過濾器的樣子:

{ 
    "prices": [ 
    { 
     "site_id": 1, 
     "currency": "GBP", 
     "value": 595, 
     "gross_tax": 1 
    }, 
    { 
     "site_id": 2, 
     "currency": "USD", 
     "value": 745, 
     "gross_tax": 0 
    } 
    ] 
} 

我希望我OK省略了這麼多這裏的文件;我不相信這是偶然的,但我當然不能確定。

我錯過了一個重要的知識點,還是我做了一些終極厚實的事情?無論哪種方式,我都會感激這位專家的知識。謝謝!

編輯

在J.T.的建議我也嘗試重新索引文件,以便prices.site_id被索引 - 沒有變化。也嘗試了下面的布爾/必須過濾器無濟於事。

爲了澄清,我使用空查詢的原因是Web界面可能會提供查詢字符串,但使用相同的代碼來簡單地過濾所有產品。因此,我留在查詢中,但是是空的,因爲這就是Elastica似乎產生的查詢字符串。

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "show_in_catalogue": true 
       } 
      }, 
      { 
       "term": { 
       "prices.site_id": 1 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

回答

2

你SITE_ID設置爲{ 「指標」: 「不」}。這會告知ElasticSearch從索引中排除該字段,從而無法在該字段上進行查詢或過濾。數據仍將被存儲。同樣,您可以將字段設置爲僅位於索引中並可搜索,但不能存儲。

我是ElasticSearch的新手,不能總是饒有興趣地提問!我實際上對你的查詢感到困惑。如果你打算「只是過濾」,那麼你不需要查詢。我不明白的是你在術語過濾器中使用了兩個字段。我從來沒有這樣做過。我想它是一個OR?另外,如果沒有匹配,它似乎會返回一切。如果你想與查詢過濾結果的查詢,那麼你可能需要使用一個

-d '{ 
    "query": { 
     "filtered": { 
     "query": {}, 
     "filter": {} 
     } 
    } 
}' 

如果你只是想應用的過濾器是應該沒有任何「查詢」必要的工作濾波器

-d '{ 
    "filter": { 
     "bool": { 
     "must": [ 
      { 
       "term": { 
        "show_in_catalogue": true 
       } 
      }, 
      { 
       "term": { 
        "prices.site_id": 1 
       } 
      } 
     ] 
     } 
    } 
}' 
+0

謝謝 - 我嘗試了你的建議並澄清了我的問題。我正在玩一個空的查詢,所以一旦過濾器處理完整的結果集,我就可以填充它。仍然無法獲得任何東西,但我會繼續黑客攻擊。 – Altreus

+0

啊哈 - 它的工作如果我索引我想過濾的所有東西。我沒有意識到你必須索引過濾器 - 我認爲它只適用於查詢搜索!如果我接受這個答案,你會澄清你的編輯來解釋這個,所以未來的讀者會發現它嗎?謝謝! – Altreus

+0

已編輯!對不起,當我重新檢查你的問題時,我正在用手機。所以,關於索引號的編輯並不突出。 –

相關問題