1. filter
filter,就是按照搜索条件过滤出需要的数据,不计算任何相关度分数,对相关度没有影响
2. filter 与 query 对比
filter,按照搜索条件过滤出需要的数据,不计算任何相关度分数,对相关度没有影响query,会去计算每个document相对于搜索条件的相关度,并按照相关度进行排序在实际开发中,如果需要把最匹配搜索条件的数据先返回,那么用query,果只是要根据一些条件筛选出一部分数据,不关注其排序,那么用filter。
3. filter 与 query 性能
filter,不需要计算相关度分数,不需要按照相关度分数进行排序,同时还有内置的自动cache最常使用filter的数据, 性能好query,要计算相关度分数,按照分数进行排序,而且无法cache结果.4. 查询示例
2{ 3"query":{ 4"bool":{ 5"must":[ 6{ 7"match":{ 8"name":"yagao" 9} 10} 11], 12"should":[ 13{ 14"match":{ 15"producer":"yagao" 16} 17 18} 19], 20"filter":{ 21"range":{ 22"price":{ 23"gte":25, 24"lt":50 25} 26} 27} 28} 29}, 30"sort":[ 31{ 32"price":{ 33"order":"desc" 34} 35} 36] 37} 复制代码1GET/ecommerce/product/_search
返回结果:
2"took":0, 3"timed_out":false, 4"_shards":{ 5"total":5, 6"successful":5, 7"skipped":0, 8"failed":0 9}, 10"hits":{ 11"total":3, 12"max_score":null, 13"hits":[ 14{ 15"_index":"ecommerce", 16"_type":"product", 17"_id":"3", 18"_score":null, 19"_source":{ 20"name":"zhonghuayagao", 21"desc":"caobenzhiwu", 22"price":40, 23"producer":"zhonghuaproducer", 24"tags":[ 25"qingxin" 26] 27}, 28"sort":[ 2940 30] 31}, 32{ 33"_index":"ecommerce", 34"_type":"product", 35"_id":"1", 36"_score":null, 37"_source":{ 38"name":"gaolujieyagao", 39"desc":"gaoxiaomeibai", 40"price":30, 41"producer":"gaolujieproducer", 42"tags":[ 43"meibai", 44"fangzhu" 45] 46}, 47"sort":[ 4830 49] 50}, 51{ 52"_index":"ecommerce", 53"_type":"product", 54"_id":"2", 55"_score":null, 56"_source":{ 57"name":"jiajieshiyagao", 58"desc":"youxiaofangzhu", 59"price":25, 60"producer":"jiajieshiproducer", 61"tags":[ 62"fangzhu" 63] 64}, 65"sort":[ 6625 67] 68} 69] 70} 71} 复制代码1{
由于我们按照价格降序排列,所以没有计算相关度,_score都等于null
注意:
对于range查询,单独使用语法为:
2{ 3"query":{ 4"range":{ 5"price":{ 6"gte":20, 7"lte":50 8} 9} 10} 11} 复制代码1GET/ecommerce/product/_search
这样能返回结果,但是如果多条件查询和range查询一起使用的话,需要将range放在bool查询的filter中,比如第一个例子。