经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Elasticsearch » 查看文章
ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询
来源:cnblogs  作者:VipSoft  时间:2023/3/14 9:11:28  对本文有异议

目录

ElasticSearch 实现分词全文检索 - 概述
ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装
ElasticSearch 实现分词全文检索 - Restful基本操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
ElasticSearch 实现分词全文检索 - 测试数据准备
ElasticSearch 实现分词全文检索 - term、terms查询
ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询
ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询
ElasticSearch 实现分词全文检索 - Scroll 深分页 --待发布
ElasticSearch 实现分词全文检索 - delete-by-query --待发布
ElasticSearch 实现分词全文检索 - 复合查询 --待发布
ElasticSearch 实现分词全文检索 - filter查询 --待发布
ElasticSearch 实现分词全文检索 - 高亮查询 --待发布
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality --待发布
ElasticSearch 实现分词全文检索 - 经纬度查询 --待发布

数据准备

ElasticSearch 实现分词全文检索 - 测试数据准备

id 查询

  1. # id 查询
  2. GET /sms-logs-index/_doc/1

Java

  1. @Test
  2. void idQuery() throws Exception{
  3. String indexName = "sms-logs-index";
  4. RestHighLevelClient client = ESClient.getClient();
  5. //1. 创建GetRequest对象
  6. GetRequest request = new GetRequest(indexName,"1");
  7. //2. 执行查询
  8. GetResponse resp = client.get(request, RequestOptions.DEFAULT);
  9. //4. 获取到 中的数据,并展示
  10. System.out.println(resp.getSourceAsMap());
  11. }

ids 查询

根据多个ID查询,类似MySQL中的 where id in (1,2,3)

  1. # ids 查询
  2. GET /sms-logs-index/_search/
  3. {
  4. "query": {
  5. "ids": {
  6. "values": ["1","2","3"]
  7. }
  8. }
  9. }

Java

  1. @Test
  2. void idsQuery() throws Exception{
  3. String indexName = "sms-logs-index";
  4. RestHighLevelClient client = ESClient.getClient();
  5. //1. 创建GetRequest对象
  6. SearchRequest request = new SearchRequest(indexName);
  7. //2. 指定查询条件
  8. SearchSourceBuilder builder = new SearchSourceBuilder();
  9. builder.query(QueryBuilders.idsQuery().addIds("1","2","3"));
  10. request.source(builder);
  11. //3. 执行查询
  12. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
  13. //4. 获取到 _source 中的数据,并展示
  14. for (SearchHit hit : resp.getHits().getHits()) {
  15. Map<String, Object> result = hit.getSourceAsMap();
  16. System.out.println(result);
  17. }
  18. }

prefix查询

前缀查询,可以通过一个关键字去指定一个Field的前缀,从而查询到指定的文档

  1. # prefix 查询
  2. GET /sms-logs-index/_search/
  3. {
  4. "query": {
  5. "prefix": {
  6. "longCode": {
  7. "value": "李"
  8. }
  9. }
  10. }
  11. }

Java

  1. @Test
  2. void prefixQuery() throws Exception{
  3. String indexName = "sms-logs-index";
  4. RestHighLevelClient client = ESClient.getClient();
  5. //1. 创建GetRequest对象
  6. SearchRequest request = new SearchRequest(indexName);
  7. //2. 指定查询条件
  8. SearchSourceBuilder builder = new SearchSourceBuilder();
  9. builder.query(QueryBuilders.prefixQuery("longCode","李"));
  10. request.source(builder);
  11. //3. 执行查询
  12. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
  13. //4. 获取到 _source 中的数据,并展示
  14. for (SearchHit hit : resp.getHits().getHits()) {
  15. Map<String, Object> result = hit.getSourceAsMap();
  16. System.out.println(result);
  17. }
  18. }

fuzzy查询

模糊查询,我们输入字符的大概,ES就可以

  1. # fuzzy 查询
  2. GET /sms-logs-index/_search/
  3. {
  4. "query": {
  5. "fuzzy": {
  6. "smsContent": {
  7. "value": "天天凯心", # 可以有错别字
  8. "prefix_length": 2 # 前N个字符,不允许出现错误,完本匹配
  9. }
  10. }
  11. }
  12. }

Java

  1. @Test
  2. void fuzzyQuery() throws Exception{
  3. String indexName = "sms-logs-index";
  4. RestHighLevelClient client = ESClient.getClient();
  5. //1. 创建GetRequest对象
  6. SearchRequest request = new SearchRequest(indexName);
  7. //2. 指定查询条件
  8. SearchSourceBuilder builder = new SearchSourceBuilder();
  9. builder.query(QueryBuilders.fuzzyQuery("smsContent","天天凯心").prefixLength(2));
  10. request.source(builder);
  11. //3. 执行查询
  12. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
  13. //4. 获取到 _source 中的数据,并展示
  14. for (SearchHit hit : resp.getHits().getHits()) {
  15. Map<String, Object> result = hit.getSourceAsMap();
  16. System.out.println(result);
  17. }
  18. }

wildcard 查询

通配查询,和MySQL中的 like 差不多,可以在查询时,在字符串中指定通配符 * 和占位符?

  1. # wildcard 查询
  2. GET /sms-logs-index/_search/
  3. {
  4. "query": {
  5. "wildcard": {
  6. "smsContent": {
  7. "value": "天*"
  8. }
  9. }
  10. }
  11. }

Java

  1. @Test
  2. void wildcardQuery() throws Exception{
  3. String indexName = "sms-logs-index";
  4. RestHighLevelClient client = ESClient.getClient();
  5. //1. 创建GetRequest对象
  6. SearchRequest request = new SearchRequest(indexName);
  7. //2. 指定查询条件
  8. SearchSourceBuilder builder = new SearchSourceBuilder();
  9. builder.query(QueryBuilders.wildcardQuery("smsContent","天*"));
  10. request.source(builder);
  11. //3. 执行查询
  12. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
  13. //4. 获取到 _source 中的数据,并展示
  14. for (SearchHit hit : resp.getHits().getHits()) {
  15. Map<String, Object> result = hit.getSourceAsMap();
  16. System.out.println(result);
  17. }
  18. }

range 查询

范围查询,只针对数值类型,对某一个Field进行大于或小于的范围指定查询

  1. # wildcard 查询
  2. GET /sms-logs-index/_search/
  3. {
  4. "query": {
  5. "range": {
  6. "fee": {
  7. "gte": 10,
  8. "lte": 20
  9. }
  10. }
  11. }
  12. }

Java

  1. @Test
  2. void rangeQuery() throws Exception{
  3. String indexName = "sms-logs-index";
  4. RestHighLevelClient client = ESClient.getClient();
  5. //1. 创建GetRequest对象
  6. SearchRequest request = new SearchRequest(indexName);
  7. //2. 指定查询条件
  8. SearchSourceBuilder builder = new SearchSourceBuilder();
  9. builder.query(QueryBuilders.rangeQuery("fee").gte(10).lte(20));
  10. request.source(builder);
  11. //3. 执行查询
  12. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
  13. //4. 获取到 _source 中的数据,并展示
  14. for (SearchHit hit : resp.getHits().getHits()) {
  15. Map<String, Object> result = hit.getSourceAsMap();
  16. System.out.println(result);
  17. }
  18. }

regexp 查询

正则查询,通过你编写的正则表达式去匹配内容

PS:prefix,fuzzy,wildcard 和 regexp 查询效率相对比较低。要求效率比较高时,避免去使用]

  1. # regexp 查询
  2. POST /sms-logs-index/_search/
  3. {
  4. "query": {
  5. "regexp": {
  6. "mobile": "1382[0-9]{7}" # 查询 1382开头的手机号
  7. }
  8. }
  9. }
  10. }

Java

  1. @Test
  2. void regexpQuery() throws Exception{
  3. String indexName = "sms-logs-index";
  4. RestHighLevelClient client = ESClient.getClient();
  5. //1. 创建GetRequest对象
  6. SearchRequest request = new SearchRequest(indexName);
  7. //2. 指定查询条件
  8. SearchSourceBuilder builder = new SearchSourceBuilder();
  9. builder.query(QueryBuilders.regexpQuery("mobile","1382[0-9]{7}"));
  10. request.source(builder);
  11. //3. 执行查询
  12. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
  13. //4. 获取到 _source 中的数据,并展示
  14. for (SearchHit hit : resp.getHits().getHits()) {
  15. Map<String, Object> result = hit.getSourceAsMap();
  16. System.out.println(result);
  17. }
  18. }

原文链接:https://www.cnblogs.com/vipsoft/p/17168115.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号