ES-- match查询

@[TOC] ## 2.2、match查询 match查询属于高层查询,会根据你查询的字段的类型不一致,采用不同的查询方式。 - 如果查询的是日期或者数值的字段,他会自动将你的字符串查询内容转换成日期或者数值对待; - 如果查询的内容是一个不能被分词的字段(**keyword**).match查询不会对你的指定查询关键字进行分词; - 如果查询的内容是一个**可以分词**的字段(text),match会将你指定的查询内容根据一定的方式去分词,然后去分词库中匹配指定的内容。 总而言之:match查询,**实际底层就是多个term查询**,将多个term查询的结果汇集到一起返回给你。 ### 2.2.1、match_all 参考官网 [Elasticsearch Reference \[7.10\] » Query DSL » Match all query](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/query-dsl-match-all-query.html#query-dsl-match-all-query) #### 2.2.1.1、命令行 查询全部内容,所有的`_socre`都是`1.0` ``` GET /sms-logs-index/_search { "query": { "match_all": {} } } ``` ![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210331101023258.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1eGludGRyaA==,size_16,color_FFFFFF,t_70) #### 2.2.1.2、java代码 ```java @Test public void matchAllQuery() throws IOException { //1、创建SearchRequest对象 SearchRequest searchRequest = new SearchRequest(); //2、指定查询条件 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.size(20); // ES 默认只查询10条,如果想查询更多,添加size() searchSourceBuilder.query(QueryBuilders.matchAllQuery()); // 3、将条件封装到Request对象中 searchRequest.source(searchSourceBuilder); // 4、执行查询 SearchResponse resp = client.search(searchRequest, RequestOptions.DEFAULT); // 5、打印结果 for (SearchHit hit : resp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } // 打印条数 System.out.println(resp.getHits().getHits().length); } ``` ![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210331102100371.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1eGludGRyaA==,size_16,color_FFFFFF,t_70) ### 2.2.2、match #### 2.2.2.1、命令行 ``` POST /sms-logs-index/_search { "query": { "match": { "smsContent": "魅力宣传" } } } ``` #### 2.2.2.2、java 代码 smsContent 是一个 text,可以进行分词 ![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210331102905325.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1eGludGRyaA==,size_16,color_FFFFFF,t_70) ### 2.2.3、布尔match **拥有match查询的特性,同时可以基于一个field匹配内容,采用and或者or的方式** #### 2.2.3.1、命令行 ```json POST /sms-logs-index/_search { "query": { "match": { "smsContent": { "query": "魅力 宣传", "operator": "or" } } } } POST /sms-logs-index/_search { "query": { "match": { "smsContent": { "query": "魅力 宣传", "operator": "and" } } } } ``` #### 2.2.3.2、java 代码 ``` @Test public void matchBoolQuery() throws IOException { //1、创建SearchRequest对象 SearchRequest searchRequest = new SearchRequest(); //2、指定查询条件 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.size(20); // ES 默认只查询10条,如果想查询更多,添加size() // searchSourceBuilder.query(QueryBuilders.matchAllQuery()); searchSourceBuilder.query(QueryBuilders.matchQuery("smsContent", "魅力 宣传").operator(Operator.AND)); // 3、将条件封装到Request对象中 searchRequest.source(searchSourceBuilder); // 4、执行查询 SearchResponse resp = client.search(searchRequest, RequestOptions.DEFAULT); // 5、打印结果 for (SearchHit hit : resp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } // 打印条数 System.out.println(resp.getHits().getHits().length); } ``` ### 2.2.4、multiMatch **拥有match的特性,multi_match针对多个field进行检索,多个field对应一个查询的关键字;** #### 2.2.4.1、命令行 实现要求,查询包含北京的字段province或者字段smsContent。 ``` POST /sms-logs-index/_search { "query": { "multi_match": { "query": "北京", "fields": ["province", "smsContent"] } } } ``` #### 2.2.4.2、java 代码 ```java // searchSourceBuilder.query(QueryBuilders.matchAllQuery()); searchSourceBuilder.query(QueryBuilders.multiMatchQuery("北京", "province", "smsContent")); ``` # 关注我的公众号【宝哥大数据】,更多干货 ![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210706081624305.png)
上一篇:电商ERP开发,总是要设计一下商品的SKU与库存


下一篇:Java与ES