最近在做一个分布式数据存储的项目,需要用到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. Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors

    Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors The goal of the pro ...

  2. java.lang.UnsupportedClassVersionError: com/android/dx/command/Main : Unsupported major.minor version 52.0

    严重性 代码 说明 项目 文件 行 禁止显示状态错误 xamarin java.lang.UnsupportedClassVersionError: com/android/dx/command/Ma ...

  3. springboot线程池的使用和扩展(转)

    springboot线程池的使用和扩展 我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行, ...

  4. Android Butterknife框架

    Android Butterknife框架 注解攻略 时间 2014-02-27 09:28:09  Msquirrel原文  http://www.msquirrel.com/?p=95 一.原理. ...

  5. c++ 实现atoi()函数

    1. 问题描写叙述 实现c++函数库中atoi()函数,要考虑到各种特殊情况: 空字符串. +和-号. 字符串前中后n个空格. 溢出. 非数字字符. 2. 解决方式 转换过程并不复杂.复杂的是要考虑到 ...

  6. 执行tsung时报"Maximum number of concurrent users in a single VM reached

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ovcer.blog.51cto.com/1145188/1581326 [roo ...

  7. 黑吃黑第四季/全集Banshee迅雷下载

    英文全名Banshee,第5季(2015)Cinemax. 本季看点:<黑吃黑>Ana Ayora加盟第四季,将会饰演Nina Cruz,表面上是在镇里一个聪明而又强悍的新副警长,但实际是 ...

  8. TextView字体,行距,html格式,超链接,最大长度的设定

    颜色,大小 <!-- 设置字体的大小,推荐用sp做单位:字体颜色以#开头 --> <TextView android:id="@+id/textView1" an ...

  9. MVC的Ajax异步请求

    @using (Ajax.BeginForm("GetTime","order",new AjaxOptions() { Confirm="你确认这么 ...

  10. jQuery的attr方法处理checkbox的问题

    现象 使用了 jQuery 1.10 的版本,想实现 checkbox 的全部选中和全部取消选中,使用了 attr 的方法,如下: $(elem).attr("checked") ...