《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.3.Search通过Kibana(5) https://developer.aliyun.com/article/1231066
Query DSL
查询索引包括全文本查询、组合查询、结构化查询等。
通常 Search 与 Filter 区别
二者的查询是有区别的:
Query 查询
用于解答文档是否存在,并且告知返回文档与查询条件的匹配度,返回 _score 评分供用户选择。
Filter 查询
只用于返回文档是否与查询匹配,但是不会告诉你匹配度,即不进行评分。在做聚合查询时,
filter 经常发挥更大的作用。因为没有评分 Elasticsearch 的处理速度就会提高,提升了整体响应时间。同时 filter 可以缓存查询结果,而 Query 则不能缓存。
使用场景
如果涉及到全文检索以及评分相关业务使用 Query,其他场景推荐使用 Filter 查询。
组合查询
Boolean 查询
Boolean 查询包含 must、filter、must_not。
must :必须匹配并且返回评分,filter 忽略评分,should 相当于数据库查询中的 or,针对
should 有一个特殊的情况,也就是所有的搜索只有 should ,那么必须满足 should 里的其中一个才会被搜索到。must_not 为不匹配,相当于不等于。
查询:店铺编码=sc00001 且渠道 channelType=cloudPlatform 且 publicPrice 价格区间不在8288-8888 之间,或者品牌包含"果"。首先以下条件必须全部满足:
l 店铺编码=sc00001
l 渠道 channelType=cloudPlatform
l publicPrice 价格区间不在 8288-8888 之间
另外,由于还有 should 查询,满足品牌中包含“果”的也会被查询出来,另外匹配成功后的评分也会提高,相应的结果也会排在前面:
l 品牌包含"果"
二者取并集的结果作为最终结果返回:
POST /my_goods/_search { "query": { "bool": { "must": { "term":{ "shopCode":"sc00001" } }, "filter": { "term": { "channelType": "cloudPlatform" } }, "must_not": [ { "range": { "publicPrice": { "gte": 8288, "lte": 8888 } } } ], "should": [ { "term": { "brandName": { "value": "果" } } } ], "minimum_should_match" : 1 } } }
minimum_should_match 为最小匹配数量,如果 bool 查询包含至少一个 should 子句,并且没有 must 或 filter 子句,则默认值为 1,否则,默认值为 0。举例说明:
POST /my_goods/_search { "query": { "bool": { "should": [ { "term": { "brandName": { "value": "东" } } }, { "term": { "brandName": { "value": "果" } } } ], "minimum_should_match" : 1 } } }
《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.3.Search通过Kibana(7) https://developer.aliyun.com/article/1231064