数据准备
ElasticSearch 实现分词全文检索 - 测试数据准备
match 查询
match查询属于高层查询,他会根据你查询的字段类型不一样,采用不同的查询方式。
- 查询的是日期或者是数值的话,他会将你基于的字符串查询内容转换为日期或者数值对待。
- 如果查询的内容是一个不能被分词的内容 (keyword) ,match查询不会对你指定的查询关键字进行分词。
- 如果查询的内容时一个可以被分词的内容 (text),match会将你指定的查询内容根据一定的方式去分词,去分词库中匹配指定的内容。
match查询,实际底层就是多个term查询,将多个term查询的结果给你封装到了一起
match_all 查询
查出全部内容,不指定任何查询条件。
# match_all 查询 POST /sms-logs-index/_search { "query":{ "match_all": { #不指定,查出全部内容(如果数据比较多,默认只查出 10 条) } } }
Java
@Test void matchAllQuery() throws Exception{ String indexName = "sms-logs-index"; RestHighLevelClient client = ESClient.getClient(); //1. 创建Request对象 SearchRequest request = new SearchRequest(indexName); //2. 指定查询条件 SearchSourceBuilder builder = new SearchSourceBuilder(); builder.query(QueryBuilders.matchAllQuery()); builder.size(20); //ES 默认只查询10条数据,如果想查询更多,添加 Size request.source(builder); //3. 执行查询 SearchResponse resp = client.search(request, RequestOptions.DEFAULT); //4. 获取到 _source 中的数据,并展示 for (SearchHit hit : resp.getHits().getHits()) { Map<String, Object> result = hit.getSourceAsMap(); System.out.println(result); } }
march 查询
周末快乐 => 周末,周,末,快乐
指定 feild 做为查询条件
POST /sms-logs-index/_search { "query":{ "match": { "smsContent": "周末快乐" #先分词,再查询 } } }
@Test void matchQuery() throws Exception{ String indexName = "sms-logs-index"; RestHighLevelClient client = ESClient.getClient(); //1. 创建Request对象 SearchRequest request = new SearchRequest(indexName); //2. 指定查询条件 SearchSourceBuilder builder = new SearchSourceBuilder(); builder.query(QueryBuilders.matchQuery("smsContent","周末快乐")); builder.size(20); //ES 默认只查询10条数据,如果想查询更多,添加 Size request.source(builder); //3. 执行查询 SearchResponse resp = client.search(request, RequestOptions.DEFAULT); //4. 获取到 _source 中的数据,并展示 for (SearchHit hit : resp.getHits().getHits()) { Map<String, Object> result = hit.getSourceAsMap(); System.out.println(result); } }
布尔match 查询
基于一个Field匹配的内容,采用 and或 or 的方式 连接
POST /sms-logs-index/_search { "query":{ "match": { "smsContent":{ "query": "开心 快乐", #内容包括开心 并且 包括快乐 "operator": "and" } } } }
Java
@Test void booleanMatchQuery() throws Exception{ String indexName = "sms-logs-index"; RestHighLevelClient client = ESClient.getClient(); //1. 创建Request对象 SearchRequest request = new SearchRequest(indexName); //2. 指定查询条件 SearchSourceBuilder builder = new SearchSourceBuilder(); builder.query(QueryBuilders.matchQuery("smsContent","开心 快乐").operator(Operator.AND)); //多个.operator(Operator.AND) builder.size(20); //ES 默认只查询10条数据,如果想查询更多,添加 Size request.source(builder); //3. 执行查询 SearchResponse resp = client.search(request, RequestOptions.DEFAULT); //4. 获取到 _source 中的数据,并展示 for (SearchHit hit : resp.getHits().getHits()) { Map<String, Object> result = hit.getSourceAsMap(); System.out.println(result); } }
multi_match 查询
match 针对一个field做检索,multi_match 针对多个 field 进行检索。多个 field 对应一个text
# 布尔match 查询 POST /sms-logs-index/_search { "query":{ "multi_match": { "query": "江苏", #指定 text "fields": ["province","smsContent"] #指定field } } }
Java
@Test void multiMatchQuery() throws Exception{ String indexName = "sms-logs-index"; RestHighLevelClient client = ESClient.getClient(); //1. 创建Request对象 SearchRequest request = new SearchRequest(indexName); //2. 指定查询条件 SearchSourceBuilder builder = new SearchSourceBuilder(); builder.query(QueryBuilders.multiMatchQuery("江苏","province","smsContent")); builder.size(20); //ES 默认只查询10条数据,如果想查询更多,添加 Size request.source(builder); //3. 执行查询 SearchResponse resp = client.search(request, RequestOptions.DEFAULT); //4. 获取到 _source 中的数据,并展示 for (SearchHit hit : resp.getHits().getHits()) { Map<String, Object> result = hit.getSourceAsMap(); System.out.println(result); } }