ElasticSearch7.3学习(二十一)----Filter与Query对比、使用explain关键字分析语法

博客 分享
0 264
优雅殿下
优雅殿下 2022-04-19 23:58:09
悬赏:0 积分 收藏

ElasticSearch7.3学习(二十一)----Filter与Query对比、使用explain关键字分析语法

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的执行计划,可以看到搜索的目标等信息。

 

posted @ 2022-04-19 23:21 |旧市拾荒| 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    优雅殿下

    优雅殿下 (王者 段位)

    2018 积分 (2)粉丝 (47)源码

    小小码农,大大世界

     

    温馨提示

    亦奇源码

    最新会员