最近在做一个分布式数据存储的项目,需要用到ElastciSearch加速数据查询,其中部分功能需要进行模糊查询和统计索引库中已经建立的索引字段,网上查阅了很多资料,最终把这两个问题解决了,不容易!下面的代码是具体的功能实现。

  1. import java.net.InetAddress;
  2. import java.net.UnknownHostException;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Set;
  8. import java.io.IOException;
  9. import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
  10. import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
  11. import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
  12. import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
  13. import org.elasticsearch.action.admin.indices.exists.types.TypesExistsResponse;
  14. import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
  15. import org.elasticsearch.action.admin.indices.stats.IndexStats;
  16. import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse;
  17. import org.elasticsearch.action.delete.DeleteResponse;
  18. import org.elasticsearch.action.get.GetResponse;
  19. import org.elasticsearch.action.index.IndexResponse;
  20. import org.elasticsearch.action.search.SearchResponse;
  21. import org.elasticsearch.client.Client;
  22. import org.elasticsearch.client.IndicesAdminClient;
  23. import org.elasticsearch.client.Requests;
  24. import org.elasticsearch.cluster.ClusterState;
  25. import org.elasticsearch.cluster.metadata.IndexMetaData;
  26. import org.elasticsearch.cluster.metadata.MappingMetaData;
  27. import org.elasticsearch.common.settings.Settings;
  28. import org.elasticsearch.common.transport.InetSocketTransportAddress;
  29. import org.elasticsearch.common.xcontent.XContentBuilder;
  30. import org.elasticsearch.common.xcontent.XContentFactory;
  31. import org.elasticsearch.index.query.BoolQueryBuilder;
  32. import org.elasticsearch.index.query.QueryBuilder;
  33. import org.elasticsearch.index.query.QueryBuilders;
  34. import org.elasticsearch.search.SearchHit;
  35. import org.elasticsearch.search.SearchHitField;
  36. import org.elasticsearch.search.SearchHits;
  37. import org.elasticsearch.transport.client.PreBuiltTransportClient;
  38. public class EsIndexwildcardQueryAndFieldStatistic {
  39. private static Client client;
  40. private static Settings settings;
  41. private static String index = "blog21";
  42. private static String type = "article21";
  43. // 注意区分5.X系列的ES版本client初始化
  44. static {
  45. settings = Settings.builder()
  46. .put("cluster.name", "backup_elasticsearch")
  47. .put("client.transport.sniff", true).build();
  48. try {
  49. client = new PreBuiltTransportClient(settings)
  50. .addTransportAddress(new InetSocketTransportAddress(
  51. InetAddress.getByName("172.17.173.21"), 9300));
  52. } catch (UnknownHostException e) {
  53. e.printStackTrace();
  54. }
  55. }
  56. public static void main(String[] args) throws IOException {
  57. // 创建索引
  58. CreateIndexResponse indexResponse = client.admin().indices()
  59. .prepareCreate(index).get();
  60. // 建立映射
  61. XContentBuilder mapping = XContentFactory.jsonBuilder().startObject()
  62. .startObject("properties").startObject("PolicyCode")
  63. .field("type", "keyword").field("store", "yes").endObject()
  64. .startObject("ServiceId").field("type", "keyword")
  65. .field("store", "yes").endObject().startObject("CreateTime")
  66. .field("type", "date").field("format", "yyyy-MM-dd HH:mm:ss")
  67. .field("store", "yes").endObject().endObject().endObject();
  68. PutMappingRequest mappingRequest = Requests.putMappingRequest(index)
  69. .source(mapping).type(type);
  70. client.admin().indices().putMapping(mappingRequest).actionGet();
  71. // 插入数据
  72. for (int i = 0; i < 10; i++) {
  73. HashMap<String, Object> hashMap = new HashMap<String, Object>();
  74. if (i % 2 == 0) {
  75. hashMap.put("PolicyCode", "5674504720");
  76. hashMap.put("ServiceId", "SE2");
  77. hashMap.put("CreateTime", "2016-08-21 00:00:01");
  78. } else {
  79. hashMap.put("PolicyCode", "666666666");
  80. hashMap.put("ServiceId", "SE3");
  81. hashMap.put("CreateTime", "2016-10-21 00:00:01");
  82. }
  83. client.prepareIndex(index, type).setSource(hashMap).get();
  84. }
  85. // 精确查询
  86. QueryBuilder qb1 = QueryBuilders.termQuery("PolicyCode", "5674504720");
  87. // 模糊查询, “*”表示0到多个字符,而使用“?”表示一个字符
  88. QueryBuilder qb2 = QueryBuilders.wildcardQuery("ServiceId", "*SE*");
  89. QueryBuilder qb3 = QueryBuilders.wildcardQuery("ServiceId", "SE?");
  90. QueryBuilder qb4 = QueryBuilders.wildcardQuery("ServiceId", "?SE?");
  91. QueryBuilder qb5 = QueryBuilders.wildcardQuery("ServiceId", "SE2?");
  92. QueryBuilder qb6 = QueryBuilders.wildcardQuery("ServiceId", "SE2*");
  93. QueryBuilder qb7 = QueryBuilders.wildcardQuery("ServiceId", "*SE3*");
  94. //       SearchResponse response = client.prepareSearch(index)
  95. //       .setTypes(type)
  96. //       .setQuery(qb3)
  97. //       .execute()
  98. //       .actionGet();
  99. try {
  100. Thread.sleep(2000);     //ES在新建 索引库后并往里面插入数据时是异步的,需要等待一定时间,才能查询到索引库中的数据
  101. } catch (InterruptedException e) {
  102. e.printStackTrace();
  103. }
  104. SearchResponse response = client.prepareSearch(index).setTypes(type)
  105. .setQuery(QueryBuilders.boolQuery().must(qb2)).get();
  106. SearchHits hits = response.getHits();
  107. if (hits.totalHits > 0) {
  108. for (SearchHit hit : hits) {
  109. System.out.println("score:" + hit.getScore() + ":\t"
  110. + hit.getId());
  111. }
  112. } else {
  113. System.out.println("搜到0条结果");
  114. }
  1. //获取索引库字段
  2. List<String> fieldList = new ArrayList<String>();
  3. ClusterState cs = client.admin().cluster().prepareState()
  4. .setIndices(index).execute().actionGet().getState();
  5. IndexMetaData imd = cs.getMetaData().index(index);
  6. MappingMetaData mdd = imd.mapping(type);
  7. Map<String, Object> mapProperties = new HashMap<String, Object>();
  8. try {
  9. mapProperties = mdd.getSourceAsMap();
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }
  13. fieldList = getIndexFieldList("", mapProperties);
  14. System.out.println("Field List:");
  15. for (String field : fieldList) {
  16. System.out.println(field);
  17. }
  18. client.close();
  19. }
  20. private static List<String> getIndexFieldList(String fieldName,
  21. Map<String, Object> mapProperties) {
  22. List<String> fieldList = new ArrayList<String>();
  23. Map<String, Object> map = (Map<String, Object>) mapProperties
  24. .get("properties");
  25. Set<String> keys = map.keySet();
  26. for (String key : keys) {
  27. if (((Map<String, Object>) map.get(key)).containsKey("type")) {
  28. fieldList.add(fieldName + "" + key);
  29. } else {
  30. List<String> tempList = getIndexFieldList(fieldName + "" + key
  31. + ".", (Map<String, Object>) map.get(key));
  32. fieldList.addAll(tempList);
  33. }
  34. }
  35. return fieldList;
  36. }
  37. }

ElasticSearch5.X—模糊查询和获取所有索引字段的更多相关文章

  1. sql 模糊查询带下划线的字段 _

    1.SELECT * FROM dbo.tb_Test 2.SELECT * FROM dbo.tb_Test WHERE name LIKE '%c_%' 3.SELECT * FROM dbo.t ...

  2. MySQL 索引失效-模糊查询,最左匹配原则,OR条件等。

    索引失效 介绍 索引失效就是我们明明在查询时的条件为索引列(包括自己新建的索引),但是索引不能起效,走的是全表扫描.explain 后可查看type=ALL. 这是为什么呢? 首先介绍有以下几种情况索 ...

  3. oracle数据库使用hint来让模糊查询走索引

    在没有创建数据直方图之前,查询优化器是cbo,可能不会选择代价最低(效率最高)的方式查询. 先创建表 --日语假名表 CREATE TABLE JAPANESE_SOUNDMARK ( ID INTE ...

  4. MySQL模糊查询

    第一种最土的方法:使用like语句第二种用全文索引 有两种方法,第一种最土的方法:使用like语句第二种听涛哥说用全文索引,就在网上搜一下: 如何在MySQL中获得更好的全文搜索结果 mysql针对这 ...

  5. 某表含有N个字段超精简模糊查询方法

    我们在做多个字段模糊查询时,是不是觉得非常麻烦?比如我要模糊查询某表多个字段存在某数据时,如下 select * from table where a like '%key%' or b  like ...

  6. MySQL中使用Like模糊查询太慢

    问题:明明建立了索引,为何Like模糊查询速度还是特别慢? Like是否使用索引? 1.like %keyword    索引失效,使用全表扫描.但可以通过翻转函数+like前模糊查询+建立翻转函数索 ...

  7. StackExchange.Redis 使用LuaScript脚本模糊查询hash

    原文:StackExchange.Redis 使用LuaScript脚本模糊查询hash 获取redis连接 public class RedisHelper { private static rea ...

  8. 【知识库】-数据库_MySQL之基本数据查询:子查询、分组查询、模糊查询

    简书作者:seay 文章出处: 关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询 回顾:[知识库]-数据库_MySQL常用SQL语句语法大全示例 Learn [已经过测试校验] 一.简单查询 ...

  9. 使用Oracle的instr函数与索引配合提高模糊查询的效率

    使用Oracle的instr函数与索引配合提高模糊查询的效率 一般来说,在Oracle数据库中,我们对tb表的name字段进行模糊查询会采用下面两种方式:1.select * from tb wher ...

随机推荐

  1. 使用Puppeteer进行数据抓取(四)——快速调试

    在我们使用chrome作为爬虫获取网页数据时,往往需如下几步. 打开chrome 导航至目标页面 等待目标页面加载完成 解析目标页面数据 保存目标页面数据 关闭chrome 我们实际的编码往往集中在第 ...

  2. Linux Shell脚本入门--wc命令

    wc 统计文件里面有多少单词,多少行,多少字符. wc语法 [root@www ~]# wc [-lwm] 选项与参数: -l :仅列出行: -w :仅列出多少字(英文单字): -m :多少字符: 默 ...

  3. 移植Python3到TQ2440(二)

    接着前一篇博文. 在上一篇博文中我们用NFS挂载根文件系统的方式启动了系统,接下来我们把移植了Python3的根文件系统固化到NandFlash中,但是由于linux-4.9目前不支持Yaffs2文件 ...

  4. android模拟器修改时间

        我们看右上角的模拟器的时间,是不是和我们现在时间不同步呢   点击主菜单之后,我们找到下边的设置的按钮   下边找到时间和日期, 怎么把页面修改中文, 可以看(安卓模拟器怎么修改语言)的经验 ...

  5. 排名前16的Java工具类

    原文:https://www.jianshu.com/p/9e937d178203 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法 ...

  6. Odoo(OpenERP)应用实践:代发货管理

    原文地址:http://blog.csdn.net/wangnan537/article/details/47091857 有些分销商,在买家下单后才向供应商采购产品,并由供应商直接发货给客户.这种模 ...

  7. Xcode 统计项目代码行数及常用快捷键

    1.统计Xcode项目代码行数 1   打开终端. 2  用ls和cd进到你项目的路径. 3   输入下面的指令: grep -r "\n" classes | wc -l (cl ...

  8. excel 批注

    Excel VBA之Name对象.Comment对象及字体设置等,点滴学习积累 存在的方式 百家号11-1518:46 ======================================== ...

  9. 异步图片下载引擎(升级版——ExecutorService+handler)

    [Android分享] 异步图片下载引擎(升级版——ExecutorService+handler)  [复制链接]     皮诺 13 主题 5 好友 844 积分 No.4 中级开发者 升级  2 ...

  10. Java(C#)基础差异-语法

    1.long类型 Java long类型,若赋值大于int型的最大值,或小于int型的最小值,则需要在数字后加L或者l,表示该数值为长整数,如long num=2147483650L. 举例如下: p ...