我想用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/