我想用2个字段Category和Brand_id过滤产品。

类别:

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

我总共有116

品牌编号:
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个。
我尝试用“过滤器”代替“必须”,但结果相同。
谢谢

最佳答案

当您将数据索引到elasticsearch中时,它使用标准分析器拆分字符串,并以反向索引https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-standard-analyzer.html生成小写标记。因此,对于文本“Pulls&Gilets”,此分析器将在倒排索引中生成三个标记-“pulls”,“&”和“gilets”。

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

因此,{match:{category:“Pulls&Gilets”}}将生成三个小写标记-“pulls”,“&”和“gilets”,它将获取所有具有以下任意一个的文档-“pulls”,“&”和“背心”

因此,您将获得更多具有以下任意一种类型的文档-类别字段的“拉”,“&”和“背心”标记。

字词查询会与索引时生成的 token 直接进行比较。
但是在术语查询中,您发送的是诸如{term:{category:“Pulls&Gilets”}}的普通文本。由于使用标准分析器对字符串进行了分析,因此不会为任何文档生成像“Pulls&Gilets”这样的标记。因此,您将获得0个文档。

理想情况下,您应该以小写形式发送所有 token ,例如--{terms:{category:[“pulls”,“&”,“Gilets”]}}

这将获取所有类别的标记为“pulls”,“&”或“Gilets”的文档

关于ruby-on-rails - Elasticsearch Bool查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44263981/

10-11 11:04