2017-05-30 239 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“