1、数据准备
首先创建book索引
PUT /book/ { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "properties": { "name": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_smart" }, "description": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_smart" }, "studymodel": { "type": "keyword" }, "price": { "type": "double" }, "timestamp": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" }, "pic": { "type": "text", "index": false } } } }
插入数据
PUT /book/_doc/1 { "name": "Bootstrap开发", "description": "Bootstrap是一个非常流行的开发框架。此开发框架可以帮助不擅长css页面开发的程序人员轻松的实现一个css,不受浏览器限制的精美界面css效果。", "studymodel": "201002", "price": 38.6, "timestamp": "2019-08-25 19:11:35", "pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg", "tags": [ "bootstrap", "dev" ] } PUT /book/_doc/2 { "name": "java编程思想", "description": "java语言是世界第一编程语言,在软件开发领域使用人数最多。", "studymodel": "201001", "price": 68.6, "timestamp": "2019-08-25 19:11:35", "pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg", "tags": [ "java", "dev" ] } PUT /book/_doc/3 { "name": "spring开发基础", "description": "spring 在java领域非常流行,java程序员都在用。", "studymodel": "201001", "price": 88.6, "timestamp": "2019-08-24 19:11:35", "pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg", "tags": [ "spring", "java" ] }
2、Filter与Query示例
需求:用户查询description中有"java程序员",并且价格大于80小于90的数据。
2.1 Query
首先采用Query来进行查询,首先查询description中有"java程序员"。
GET /book/_search { "query": { "bool": { "must": [ { "match": { "description": "java程序员" } } ] } } }
查询结果如下:
可以看到,查询出来两条数据,score分别是1.9、0.5。
然后查询description中有"java程序员",并且价格大于80小于90的数据
GET /book/_search { "query": { "bool": { "must": [ { "match": { "description": "java程序员" } }, { "range": { "price": { "gte": 80, "lte": 90 } } } ] } } }
再次查看结果:
这次查询出来一条数据,score变为2.9。这一条数据在上一次的查询结果中的score为1.9。然后接着往下看使用Filter。
2.2 filter
还是相同的需求,首先查询description中有"java程序员"。
GET /book/_search { "query": { "bool": { "must": [ { "match": { "description": "java程序员" } } ] } } }
查询结果如下:
通过查询结果可以看到,查询的两条数据的score是1.9、0.5。
然后使用filter查询description中有"java程序员",并且价格大于80小于90的数据
GET /book/_search { "query": { "bool": { "must": [ { "match": { "description": "java程序员" } } ], "filter": { "range": { "price": { "gte": 80, "lte": 90 } } } } } }
查询结果如下:
可以看到,查询出来的数据与使用query查询结果一样,但是score依旧为1.9。
说明在使用query查询的过程中,影响到了相关度(score)的排序,在使用filter进行查询,并不会影响相关度(score)的计算。
2.3 filter与query对比
filter,仅仅只是按照搜索条件过滤出需要的数据而已,不计算任何相关度分数,对相关度没有任何影响。
query,会去计算每个document相对于搜索条件的相关度,并按照相关度进行排序。
应用场景:
一般来说,如果你是在进行搜索,需要将最匹配搜索条件的数据先返回,那么用query。如果你只是要根据一些条件筛选出一部分数据,不关注其排序,那么用filter。
2.4 filter与query性能
filter,不需要计算相关度分数,不需要按照相关度分数进行排序,同时还有内置的自动cache最常使用filter的数据。比如在范围查询,keyword字段查询中推荐使用filter来进行查询。
query,相反,要计算相关度分数,按照分数进行排序,而且无法cache结果。
在同等查询结果下,filter的性能一般是要优于query的。
3、explain分析语法
在实际的应用过程中,需要查询的逻辑一般比较复杂,那当语句冗长的时候,这时候显然不太可能通过直接执行语句来调试语法正确与否,这个时候就可以通过explain来验证语句的正确性。
验证错误语句:
GET /book/_validate/query?explain { "query": { "mach": { "description": "java程序员" } } }
返回结果如下,错误信息为没有名叫mach的query。
{ "valid" : false, "error" : "org.elasticsearch.common.ParsingException: no [query] registered for [mach]" }
再来看语句正确的情况下
GET /book/_validate/query?explain { "query": { "match": { "description": "java程序员" } } }
返回,返回结果还包含对语句的解释:从description查询java关键词,从description查询程序员关键词。
{ "_shards" : { "total" : 1, "successful" : 1, "failed" : 0 }, "valid" : true, "explanations" : [ { "index" : "book", "valid" : true, "explanation" : "description:java description:程序员" } ] }
应用场景:
一般用在那种特别复杂庞大的搜索下,比如你一下子写了上百行的搜索,这个时候可以先用validate api去验证一下,搜索是否合法。合法以后,explain就像mysql的执行计划,可以看到搜索的目标等信息。
热门文章
- 2月14日|V2ray/Clash/Shadowrocket/SSR每天更新18.8M/S免费节点订阅链接地址分享
- 1月20日|SSR/Shadowrocket/V2ray/Clash每天更新21.4M/S免费节点订阅链接地址分享
- 狗狗打疫苗需要多少钱(狗狗打疫苗多少钱一针 有手续吗)
- 狗粮加盟店 狗粮加盟厂
- 1月21日|Shadowrocket/Clash/V2ray/SSR每天更新22.2M/S免费节点订阅链接地址分享
- redis学习之redis持久化
- vue中的可拖拽宽度div的实现示例_vue.js
- 猫驱虫多少钱一只(猫驱虫多少钱一次)
- 2月19日|SSR/Shadowrocket/Clash/V2ray每天更新21.5M/S免费节点订阅链接地址分享
- 打了动物疫苗为什么发热呢(动物疫苗反应有哪些)