ElasticSearch5.X—模糊查询和获取所有索引字段
最近在做一个分布式数据存储的项目,需要用到ElastciSearch加速数据查询,其中部分功能需要进行模糊查询和统计索引库中已经建立的索引字段,网上查阅了很多资料,最终把这两个问题解决了,不容易!下面的代码是具体的功能实现。
- import java.net.InetAddress;
- import java.net.UnknownHostException;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import java.io.IOException;
- import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
- import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
- import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
- import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
- import org.elasticsearch.action.admin.indices.exists.types.TypesExistsResponse;
- import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
- import org.elasticsearch.action.admin.indices.stats.IndexStats;
- import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse;
- import org.elasticsearch.action.delete.DeleteResponse;
- import org.elasticsearch.action.get.GetResponse;
- import org.elasticsearch.action.index.IndexResponse;
- import org.elasticsearch.action.search.SearchResponse;
- import org.elasticsearch.client.Client;
- import org.elasticsearch.client.IndicesAdminClient;
- import org.elasticsearch.client.Requests;
- import org.elasticsearch.cluster.ClusterState;
- import org.elasticsearch.cluster.metadata.IndexMetaData;
- import org.elasticsearch.cluster.metadata.MappingMetaData;
- import org.elasticsearch.common.settings.Settings;
- import org.elasticsearch.common.transport.InetSocketTransportAddress;
- import org.elasticsearch.common.xcontent.XContentBuilder;
- import org.elasticsearch.common.xcontent.XContentFactory;
- import org.elasticsearch.index.query.BoolQueryBuilder;
- import org.elasticsearch.index.query.QueryBuilder;
- import org.elasticsearch.index.query.QueryBuilders;
- import org.elasticsearch.search.SearchHit;
- import org.elasticsearch.search.SearchHitField;
- import org.elasticsearch.search.SearchHits;
- import org.elasticsearch.transport.client.PreBuiltTransportClient;
- public class EsIndexwildcardQueryAndFieldStatistic {
- private static Client client;
- private static Settings settings;
- private static String index = "blog21";
- private static String type = "article21";
- // 注意区分5.X系列的ES版本client初始化
- static {
- settings = Settings.builder()
- .put("cluster.name", "backup_elasticsearch")
- .put("client.transport.sniff", true).build();
- try {
- client = new PreBuiltTransportClient(settings)
- .addTransportAddress(new InetSocketTransportAddress(
- InetAddress.getByName("172.17.173.21"), 9300));
- } catch (UnknownHostException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) throws IOException {
- // 创建索引
- CreateIndexResponse indexResponse = client.admin().indices()
- .prepareCreate(index).get();
- // 建立映射
- XContentBuilder mapping = XContentFactory.jsonBuilder().startObject()
- .startObject("properties").startObject("PolicyCode")
- .field("type", "keyword").field("store", "yes").endObject()
- .startObject("ServiceId").field("type", "keyword")
- .field("store", "yes").endObject().startObject("CreateTime")
- .field("type", "date").field("format", "yyyy-MM-dd HH:mm:ss")
- .field("store", "yes").endObject().endObject().endObject();
- PutMappingRequest mappingRequest = Requests.putMappingRequest(index)
- .source(mapping).type(type);
- client.admin().indices().putMapping(mappingRequest).actionGet();
- // 插入数据
- for (int i = 0; i < 10; i++) {
- HashMap<String, Object> hashMap = new HashMap<String, Object>();
- if (i % 2 == 0) {
- hashMap.put("PolicyCode", "5674504720");
- hashMap.put("ServiceId", "SE2");
- hashMap.put("CreateTime", "2016-08-21 00:00:01");
- } else {
- hashMap.put("PolicyCode", "666666666");
- hashMap.put("ServiceId", "SE3");
- hashMap.put("CreateTime", "2016-10-21 00:00:01");
- }
- client.prepareIndex(index, type).setSource(hashMap).get();
- }
- // 精确查询
- QueryBuilder qb1 = QueryBuilders.termQuery("PolicyCode", "5674504720");
- // 模糊查询, “*”表示0到多个字符,而使用“?”表示一个字符
- QueryBuilder qb2 = QueryBuilders.wildcardQuery("ServiceId", "*SE*");
- QueryBuilder qb3 = QueryBuilders.wildcardQuery("ServiceId", "SE?");
- QueryBuilder qb4 = QueryBuilders.wildcardQuery("ServiceId", "?SE?");
- QueryBuilder qb5 = QueryBuilders.wildcardQuery("ServiceId", "SE2?");
- QueryBuilder qb6 = QueryBuilders.wildcardQuery("ServiceId", "SE2*");
- QueryBuilder qb7 = QueryBuilders.wildcardQuery("ServiceId", "*SE3*");
- // SearchResponse response = client.prepareSearch(index)
- // .setTypes(type)
- // .setQuery(qb3)
- // .execute()
- // .actionGet();
- try {
- Thread.sleep(2000); //ES在新建 索引库后并往里面插入数据时是异步的,需要等待一定时间,才能查询到索引库中的数据
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- SearchResponse response = client.prepareSearch(index).setTypes(type)
- .setQuery(QueryBuilders.boolQuery().must(qb2)).get();
- SearchHits hits = response.getHits();
- if (hits.totalHits > 0) {
- for (SearchHit hit : hits) {
- System.out.println("score:" + hit.getScore() + ":\t"
- + hit.getId());
- }
- } else {
- System.out.println("搜到0条结果");
- }
- //获取索引库字段
- List<String> fieldList = new ArrayList<String>();
- ClusterState cs = client.admin().cluster().prepareState()
- .setIndices(index).execute().actionGet().getState();
- IndexMetaData imd = cs.getMetaData().index(index);
- MappingMetaData mdd = imd.mapping(type);
- Map<String, Object> mapProperties = new HashMap<String, Object>();
- try {
- mapProperties = mdd.getSourceAsMap();
- } catch (IOException e) {
- e.printStackTrace();
- }
- fieldList = getIndexFieldList("", mapProperties);
- System.out.println("Field List:");
- for (String field : fieldList) {
- System.out.println(field);
- }
- client.close();
- }
- private static List<String> getIndexFieldList(String fieldName,
- Map<String, Object> mapProperties) {
- List<String> fieldList = new ArrayList<String>();
- Map<String, Object> map = (Map<String, Object>) mapProperties
- .get("properties");
- Set<String> keys = map.keySet();
- for (String key : keys) {
- if (((Map<String, Object>) map.get(key)).containsKey("type")) {
- fieldList.add(fieldName + "" + key);
- } else {
- List<String> tempList = getIndexFieldList(fieldName + "" + key
- + ".", (Map<String, Object>) map.get(key));
- fieldList.addAll(tempList);
- }
- }
- return fieldList;
- }
- }
ElasticSearch5.X—模糊查询和获取所有索引字段的更多相关文章
- sql 模糊查询带下划线的字段 _
1.SELECT * FROM dbo.tb_Test 2.SELECT * FROM dbo.tb_Test WHERE name LIKE '%c_%' 3.SELECT * FROM dbo.t ...
- MySQL 索引失效-模糊查询,最左匹配原则,OR条件等。
索引失效 介绍 索引失效就是我们明明在查询时的条件为索引列(包括自己新建的索引),但是索引不能起效,走的是全表扫描.explain 后可查看type=ALL. 这是为什么呢? 首先介绍有以下几种情况索 ...
- oracle数据库使用hint来让模糊查询走索引
在没有创建数据直方图之前,查询优化器是cbo,可能不会选择代价最低(效率最高)的方式查询. 先创建表 --日语假名表 CREATE TABLE JAPANESE_SOUNDMARK ( ID INTE ...
- MySQL模糊查询
第一种最土的方法:使用like语句第二种用全文索引 有两种方法,第一种最土的方法:使用like语句第二种听涛哥说用全文索引,就在网上搜一下: 如何在MySQL中获得更好的全文搜索结果 mysql针对这 ...
- 某表含有N个字段超精简模糊查询方法
我们在做多个字段模糊查询时,是不是觉得非常麻烦?比如我要模糊查询某表多个字段存在某数据时,如下 select * from table where a like '%key%' or b like ...
- MySQL中使用Like模糊查询太慢
问题:明明建立了索引,为何Like模糊查询速度还是特别慢? Like是否使用索引? 1.like %keyword 索引失效,使用全表扫描.但可以通过翻转函数+like前模糊查询+建立翻转函数索 ...
- StackExchange.Redis 使用LuaScript脚本模糊查询hash
原文:StackExchange.Redis 使用LuaScript脚本模糊查询hash 获取redis连接 public class RedisHelper { private static rea ...
- 【知识库】-数据库_MySQL之基本数据查询:子查询、分组查询、模糊查询
简书作者:seay 文章出处: 关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询 回顾:[知识库]-数据库_MySQL常用SQL语句语法大全示例 Learn [已经过测试校验] 一.简单查询 ...
- 使用Oracle的instr函数与索引配合提高模糊查询的效率
使用Oracle的instr函数与索引配合提高模糊查询的效率 一般来说,在Oracle数据库中,我们对tb表的name字段进行模糊查询会采用下面两种方式:1.select * from tb wher ...
随机推荐
- Serilog中的Jobject/Jtoken对象序列化的问题
今天使用Serilog打印object对象的时候,发现Jtoken对象输出成 [[[]] 这种形式了,本来以为是传入参数的问题,确认了几遍后发现确实是Serilog输出的问题.github上也有人提出 ...
- STM32 F4 Clock Sources
STM32 F4 Clock Sources Goal: routing clock sources to the microcontroller output pin (MCO1) High- ...
- linux网络编程:splice函数和tee( )函数高效的零拷贝
splice( )函数 在两个文件描述符之间移动数据,同sendfile( )函数一样,也是零拷贝. 函数原型: #include <fcntl.h> ssize_t splice(int ...
- java高新技术
一.静态导入: import static语句导入一个类中的某个静态方法或所有方法: 例子: 1.import static java.lang.Math.max; 只是导入了Math类中的max方法 ...
- VB.NET中Module的概念
今天学习VB.NET,发现VB.NET里面有一个Module的东西,如下图(图-1)所示: 图-1 上网查了一下VB.NET里面的Module,才发现这是学习VB.NET遇到的第一个典型的问题就是:为 ...
- TrinityCore 魔兽世界私服11159 完整配置
为什么要研究TrinityCore ? (1)它是一个完整成熟的可运行调试的网游服务器框架. (2)它是一个跨平台的标准C++编写的项目,在Windows.Linux.MacOSX上都可编译运行. ( ...
- 完美.PCK文件不完全详解
building.pck:建筑物 configs.pck:配置文件interface.pck:玩过魔兽的都晓得这个是什么~interface顾名思义·facedata.pck,人物脸型,细节.不要改, ...
- Ubuntu14.04LTS下使用eclipse搭建Cocos2d-x的Android环境
from://http://www.58player.com/blog-2534-94136.html 最近想玩玩游戏制作,于是选择了目前流行的游戏引擎Cocos2d-x,这个东西虽然有Android ...
- 工具:使用过的 API 文档生成工具
背景 2012 年之前几乎没有为代码增加注释,当然,代码的命名也不见得合理(好的代码胜过面面俱到的注释),后来接触过一些开源框架,优秀的框架都有一个特点:文档和示例非常多,在后来的日子里,几乎会强制自 ...
- [转]“菜”鸟理解.NET Framework(CLI,CLS,CTS,CLR,FCL,BCL)
既然要学.NET,就要先认识认识她,我不喜欢大段大段文字的东西,自己通过理解,画个图,来看看.NET的沉鱼落雁,闭月羞花之容. 最下层蓝色部分是.NET Framework的基础,也是所有应用软件的基 ...