2017-05-30 149 views
0

我想過濾帶有2個字段,Category和Brand_id的產品。Elasticsearch Bool查詢

類別:

Product.__elasticsearch__.search query: { match: { category: "Pulls & Gilets" } } 

我總共116

Brand_id的有:

Product.__elasticsearch__.search query: { match: { brand_id: "1" } } 

我總共4

兩者得到:

Product.__elasticsearch__.search query: { 
        bool: { 
        must: { 
         term: { brand_id: "1" } 
        }, 
        must: { 
         term: { category: "Pulls & Gilets" } 
         } 
        } 
        } 

我應該總共有4個,我得到了0個。 我試過用「過濾器」而不是「必須」,但結果相同。 謝謝

+0

爲什麼你在第二個查詢中使用了'term:{category:」Pulls&Gilets「}」..用'match'去 – Richa

回答

0

當您將數據索引到elasticsearch時,它使用標準分析器拆分字符串,並在倒排索引中生成小寫標記 - https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-standard-analyzer.html。因此,對於文本「Pulls & Gilets」,此分析器將生成三個令牌 - 「拉」,「&」和倒立索引中的「gilets」。

匹配查詢是全文查詢,它在比較任何字符串之前使用字段分析器。

所以{匹配:{類別:「拉&馬甲」}}將產生三個小寫令牌 - 「拉」,「&」和「馬甲」,它會獲取有這些的所有文檔 - 「拉」 「&」和「馬甲」

因此,你正變得越來越具有其中任何一個證件號碼 - 「拉」,「&」和「馬甲」令牌類別字段。

術語查詢直接與索引時生成的標記進行比較。 但在定期查詢中,您發送的正常文本類似{term:{category:「Pulls & Gilets」}}。並且沒有像「Pulls & Gilets」這樣的標記爲任何文檔生成,因爲它使用標準分析器進行分析。因此你得到0個文件。

理想情況下,你應該把所有的令牌一樣小寫 - {而言:{類別:「拉」,「&」,「馬甲」]}}

這將獲取具有標記類別中的所有文檔「拉「,」&「或」Gilets「