~~~ ## 高级查询 ### 说明 ​ ES中提供了一种强大的检索数据方式,这种检索方式称之为`Query DSL`<Domain Specified Language> ,`Query DSL`是利用`Rest API传递JSON格式的请求体(Request Body)数据`与ES进行交互,这种方式的`丰富查询语法`让ES检索变得`更强大,更简洁`。 ### 语法 ```markdown # GET /索引名/_doc/_search {json格式请求体数据} # GET /索引名/_search {json格式请求体数据} ``` - 测试数据 ```markdown # 1.创建索引 映射 PUT /products/ { "mappings": { "properties": { "title":{ "type": "keyword" }, "price":{ "type": "double" }, "created_at":{ "type":"date" }, "description":{ "type":"text" } } } } # 2.测试数据 PUT /products/_doc/_bulk {"index":{}} {"title":"iphone12 pro","price":8999,"created_at":"2020-10-23","description":"iPhone 12 Pro采用超瓷晶面板和亚光质感玻璃背板,搭配不锈钢边框,有银色、石墨色、金色、海蓝色四种颜色。宽度:71.5毫米,高度:146.7毫米,厚度:7.4毫米,重量:187克"} {"index":{}} {"title":"iphone12","price":4999,"created_at":"2020-10-23","description":"iPhone 12 高度:146.7毫米;宽度:71.5毫米;厚度:7.4毫米;重量:162克(5.73盎司) [5] 。iPhone 12设计采用了离子玻璃,以及7000系列铝金属外壳。"} {"index":{}} {"title":"iphone13","price":6000,"created_at":"2021-09-15","description":"iPhone 13屏幕采用6.1英寸OLED屏幕;高度约146.7毫米,宽度约71.5毫米,厚度约7.65毫米,重量约173克。"} {"index":{}} {"title":"iphone13 pro","price":8999,"created_at":"2021-09-15","description":"iPhone 13Pro搭载A15 Bionic芯片,拥有四种配色,支持5G。有128G、256G、512G、1T可选,售价为999美元起。"} ``` ### 常见检索 #### 查询所有[match_all] > **match_all关键字:** 返回索引中的全部文档 ```http GET /products/_search { "query": { "match_all": {} } } ``` #### 关键词查询(term) > **term 关键字**: 用来使用关键词查询 ```http GET /products/_search { "query": { "term": { "price": { "value": 4999 } } } } ``` > NOTE1: 通过使用term查询得知ES中默认使用分词器为`标准分词器(StandardAnalyzer),标准分词器对于英文单词分词,对于中文单字分词`。 > NOTE2: 通过使用term查询得知,`在ES的Mapping Type 中 keyword , date ,integer, long , double , boolean or ip 这些类型不分词,只有text类型分词`。 #### 范围查询[range] > **range 关键字**: 用来指定查询指定范围内的文档 ```http GET /products/_search { "query": { "range": { "price": { "gte": 1400, "lte": 9999 } } } } ``` #### 前缀查询[prefix] > **prefix 关键字**: 用来检索含有指定前缀的关键词的相关文档 ```http GET /products/_search { "query": { "prefix": { "title": { "value": "ipho" } } } } ``` #### 通配符查询[wildcard] > **wildcard 关键字**: 通配符查询 **? 用来匹配一个任意字符 * 用来匹配多个任意字符** ```http GET /products/_search { "query": { "wildcard": { "description": { "value": "iphon*" } } } } ``` #### 多id查询[ids] > **ids 关键字** : 值为数组类型,用来根据一组id获取多个对应的文档 ```http GET /products/_search { "query": { "ids": { "values": ["verUq3wBOTjuBizqAegi","vurUq3wBOTjuBizqAegk"] } } } ``` #### 模糊查询[fuzzy] > **fuzzy 关键字**: 用来模糊查询含有指定关键字的文档 ```http GET /products/_search { "query": { "fuzzy": { "description": "iphooone" } } } ``` > 注意: `fuzzy 模糊查询 最大模糊错误 必须在0-2之间` > > - 搜索关键词长度为 2 不允许存在模糊 > > - 搜索关键词长度为3-5 允许一次模糊 > > - 搜索关键词长度大于5 允许最大2模糊 #### 布尔查询[bool] > **bool 关键字**: 用来组合多个条件实现复杂查询 > > ​ **must: 相当于&& 同时成立** > > ​ **should: 相当于|| 成立一个就行** > > ​ **must_not: 相当于! 不能满足任何一个** ```http GET /products/_search { "query": { "bool": { "must": [ {"term": { "price": { "value": 4999 } }} ] } } } ``` #### 多字段查询[multi_match] ```http GET /products/_search { "query": { "multi_match": { "query": "iphone13 毫", "fields": ["title","description"] } } } 注意: 字段类型分词,将查询条件分词之后进行查询改字段 如果该字段不分词就会将查询条件作为整体进行查询 ``` #### 默认字段分词查询[query_string] ```http GET /products/_search { "query": { "query_string": { "default_field": "description", "query": "屏幕真的非常不错" } } } 注意: 查询字段分词就将查询条件分词查询 查询字段不分词将查询条件不分词查询 ``` #### 高亮查询[highlight] > **highlight 关键字**: 可以让符合条件的文档中的关键词高亮 ```http GET /products/_search { "query": { "term": { "description": { "value": "iphone" } } }, "highlight": { "fields": { "*":{} } } } ``` > **自定义高亮html标签**: 可以在highlight中使用`pre_tags`和`post_tags` ```http GET /products/_search { "query": { "term": { "description": { "value": "iphone" } } }, "highlight": { "post_tags": ["</span>"], "pre_tags": ["<span style='color:red'>"], "fields": { "*":{} } } } ``` > 多字段高亮 使用`require_field_match`开启多个字段高亮 ```http GET /products/_search { "query": { "term": { "description": { "value": "iphone" } } }, "highlight": { "require_field_match": "false", "post_tags": ["</span>"], "pre_tags": ["<span style='color:red'>"], "fields": { "*":{} } } } ``` #### 返回指定条数[size] > **size 关键字**: 指定查询结果中返回指定条数。 **默认返回值10条** ```http GET /products/_search { "query": { "match_all": {} }, "size": 5 } ``` #### 分页查询[form] > **from 关键字**: 用来指定起始返回位置,和**size关键字连用可实现分页效果** ```http GET /products/_search { "query": { "match_all": {} }, "size": 5, "from": 0 } ``` #### 指定字段排序[sort] ```http GET /products/_search { "query": { "match_all": {} }, "sort": [ { "price": { "order": "desc" } } ] } ``` #### 返回指定字段[_source] > **_source 关键字**: 是一个数组,在数组中用来指定展示那些字段 ```http GET /products/_search { "query": { "match_all": {} }, "_source": ["title","description"] } ``` ~~~