文档章节

Elasticsearch学习总结三 elasticSearch基本操作API

winstone
 winstone
发布于 2017/05/25 21:08
字数 1371
阅读 491
收藏 35

1.首先将es中所有的操作封装成为一个EsSearchManager,并且使用单例模式,提供一个实例外部调用。

EsSearchManager esSearchManager = EsSearchManager.getInstance();

getInstance()的返回值是这个类的实例,构造函数中也是对client的创建

public static EsSearchManager getInstance(){
		if(null == esSearchManager ){
			synchronized (EsSearchManager.class){
				esSearchManager = new EsSearchManager();
			}
		}
		return  esSearchManager;
	}

	private EsSearchManager(){
		getClient();
	}

private Client getClient()  {
		try{
			if(client==null){
				init();
			}
		}catch (Exception e){
			LOG.error(e.getMessage());
		}
		return client;
	}

private void init() throws Exception {
		client = EsClient.getClient();
	}

2.得到了client就可以创建索引,存入数据等一系列的索引数据操作了

根据索引和类型创建索引。

      /**
	 * 根据索引和类型创建索引
	 * @param indexName
	 * @param type
	 * @return
	 * @throws Exception
     */
	public Boolean buildIndex(String indexName,String type) throws Exception {
		IndicesExistsResponse response = getClient().admin().indices()
				.prepareExists(indexName,type).execute().actionGet();
		Boolean flag = true;
		ResourceBundle rb = ResourceBundle.getBundle("commons");
		String replicas = rb.getString("replicas");
		String shards = rb.getString("shards");
		String refreshInterval = rb.getString("refreshInterval");
		if (!response.isExists()) { //需要将配置放置到配置文件中
			Settings settings = Settings.settingsBuilder()
					.put("number_of_replicas", Integer.parseInt(replicas))
					.put("number_of_shards", Integer.parseInt(shards))
					.put("index.translog.flush_threshold_ops", 10000000)
					.put("refresh_interval", refreshInterval)
					.put("index.codec", "best_compression").build();
			CreateIndexResponse createIndxeResponse = getClient().admin().indices()
					.prepareCreate(indexName).setSettings(settings).addMapping(type).execute()
					.actionGet();
			flag = createIndxeResponse.isAcknowledged();
			LOG.info("返回值" + flag);
		}
		return flag;
	}

/**
	 * 创建单条索引
	 * @param indexName
	 * @param type
	 * @param json
	 * @throws Exception
     */
	public void buildDocument(String indexName, String type, String json) throws Exception {
		getClient().prepareIndex(indexName, type).setSource(json).execute()
				.actionGet();
	}


/**
	 * 构造list集合索引数据
	 * @param indexName
	 * @param type
	 * @param list
     */
	public  void buildList2Documents(String indexName, String type, List<Map<String,Object>> list) throws  Exception{
		BulkRequestBuilder bulkRequest = getClient().prepareBulk();
		for(Map<String,Object> map : list){
			bulkRequest.add(getClient().prepareIndex(indexName, type)
					.setSource(this.generateJson(map)));
		}
		BulkResponse bulkIndexResponse = bulkRequest.execute().actionGet();
		if (bulkIndexResponse.hasFailures()) {
			LOG.error(bulkIndexResponse.buildFailureMessage());
		}

	}

如何判断索引是否存在,删除索引,下面就是判断和删除索引的方法

/**
	 * 根据索引名称判断索引是否存在
	 * @param indexName
	 * @return
	 * @throws NumberFormatException
	 * @throws UnknownHostException
     */
	public Boolean existsIndex(String indexName) throws Exception {
		IndicesExistsResponse response = getClient().admin().indices()
				.prepareExists(indexName).execute().actionGet();
		return response.isExists();
	}


/**
	 * 根据索引名称删除索引
	 * @param indexName
	 * @return
	 * @throws NumberFormatException
	 * @throws UnknownHostException
     */
	public Boolean deleteIndex(String indexName) throws Exception {
		boolean flag = true;
		IndicesExistsResponse response = getClient().admin().indices()
				.prepareExists(indexName).execute().actionGet();
		if (response.isExists()) {
			DeleteIndexResponse response2 = getClient().admin().indices()
					.prepareDelete(indexName).execute().actionGet();
			flag = response2.isAcknowledged();
		}
		return flag;
	}

根据docId删除某一条索引记录

**
	 * 根据索引Id删除文档
	 * @param indexName
	 * @param type
	 * @param docId
	 * @throws NumberFormatException
	 * @throws UnknownHostException
     */
	public void deleteDocument(String indexName, String type, String docId)
			throws Exception {
		getClient().prepareDelete(indexName, type, docId).execute().actionGet();
	}

3.上面给出了一些索引的基本操作,下面来讲讲es中如何根据索引去查询数据呢

  ```
      /**   下面这个方法就是构建全文检索,根据关键词全文检索
  *      全文检索查询,多条件类型查询
      */
public PageEntity<JSONObject> queryFulltext(List<String> keywords,
		List<String> indexs, List<String> types, List<String> fieldNames,
		List<String> allColumns, int pagenum, int pagesize)
		throws Exception {
	BoolQueryBuilder qb = buildFullText(keywords, types, fieldNames);
	if (qb == null) {
		LOG.info("queryFull Text  == null");
		return null;
	}
	LOG.info("Fulltext begin");
	long begin = System.currentTimeMillis();
	PageEntity<JSONObject> result = execute(qb, fieldNames,allColumns, indexs, types,
			 pagenum, pagesize);
	long end = System.currentTimeMillis();
	LOG.info("query Fulltext end cost:[{}]ms", end - begin);
	return result;
}


   /**
 * 构造多字段 全文搜索查询条件
 * [@param]keywords
 * [@param types
 * [@param] fieldNames
 * [@return
    * @throws Exception
    */
private BoolQueryBuilder buildFullText(List<String> keywords,
		List<String> types, List<String> fieldNames)
		throws Exception {
	BoolQueryBuilder qb = null;
	if (keywords != null && keywords.size() > 0 && fieldNames != null
			&& fieldNames.size() > 0 && types != null && types.size() > 0) {
		qb = QueryBuilders.boolQuery();
		for (String keyword : keywords) {
			QueryBuilder mustCondition = QueryBuilders.multiMatchQuery(
					keyword, fieldNames.toArray(new String[0]));
			qb.must(mustCondition);
		}
	}
	return qb;
}

上面的方法实现的全文检索,只要某个字段或者某几个字段实现了分词,就可以实现类似数据库中的模糊匹配查询,下面介绍下term查询,只是针对某些特殊字段完全匹配才能够查询到,这些字段往往都是不需要分词的。



      /**
 * term 查询(在查询的时候不分词,主要针对 人名 地名等特殊的词语)
 * [[@param](https://my.oschina.net/u/2303379)] keywords
 * [@param) types
 * [[@param](https://my.oschina.net/u/2303379)] fieldnames
 * [[@param](https://my.oschina.net/u/2303379)] pagenum
 * [[@param](https://my.oschina.net/u/2303379)] pagesize
 * @throws Exception
 */
public PageEntity<JSONObject> queryWithTerm(List<String> keywords,
		List<String> indexs, List<String> types, List<String> fieldnames,
		List<String> dateFieldnames, List<String> allColumns,
		Long startTime, Long endTime, int pagenum, int pagesize)
		throws Exception {
	BoolQueryBuilder qb = buildTermQuery(keywords, types, fieldnames,
			dateFieldnames, startTime, endTime);
	if (qb == null) {
		LOG.info("queryTerm() QueryBuilder == null");
		return new PageEntity<JSONObject>();
	}
	LOG.info("query begin");
	long begin = System.currentTimeMillis();
	PageEntity<JSONObject> result = execute(qb, fieldnames, allColumns,
			indexs, types, pagenum, pagesize);
	long end = System.currentTimeMillis();
	LOG.info("query end cost:[{}]ms", end - begin);

	return result;
}

 /**
 * es query 实现es分页查询
 * @param qb
 * @param fieldnames
 * @param allColumns
 * @param indexs
 * @param types
 * @param pagenum
 * @param pagesize
 * @return
 * @throws Exception
 */
private PageEntity<JSONObject> execute(QueryBuilder qb,
		List<String> fieldnames, List<String> allColumns,
		List<String> indexs, List<String> types, int pagenum, int pagesize)
		throws Exception {
	PageEntity<JSONObject> page = new PageEntity<JSONObject>();
	String[] typeArry = types.toArray(new String[0]);
	String[] indexArry = indexs.toArray(new String[0]);
	int startnum = (pagenum - 1) * pagesize;
	SearchResponse response = null;
	try {
		response = getClient().prepareSearch(indexArry).setTypes(typeArry)
				.setQuery(qb).setFrom(startnum).setSize(pagesize)
				.execute().actionGet();
	} catch (Exception e) {
		LOG.error("query error", e);
		throw e;
	}
	if (response == null) {
		return page;
	}
	SearchHits hits = response.getHits();
	LOG.info("execute hit:" + hits.totalHits());
	List<JSONObject> resultString = new ArrayList<JSONObject>();
	if (null != hits && hits.totalHits() > 0) {
		for (SearchHit hit : hits) {
			JSONObject obj = new JSONObject();
			if (allColumns != null && allColumns.size() > 0) {
				fieldnames = allColumns;
			}
			for (String str : fieldnames) {
				obj.put(str, hit.getSource().get(str));
			}
			resultString.add(obj);
		}
	}
	page.setContents(resultString);
	page.setPageSize(pagesize);
	page.setCurrentPageNo(pagenum);
	page.setTotalCount(hits.totalHits());
	return page;
}
  • 4.下面的例子代码演示如何调用上述代码操作es的

  • 创建testIndex中的testType类型的索引

  • EsSearchManager esSearchManager = EsSearchManager.getInstance();
    
  •       esSearchManager.buildIndex("testIndex","testType");
    
  •          //索引数据
    
  •         List<Map<String,Object>> list = new ArrayList<>();
    
  •         Map<String,Object> map = new HashMap<>();
    
  •         map.put("fieldA",100);
    
  •         map.put("fieldB",22);
    
  •         map.put("fieldC","hoge");
    
  •         map.put("fieldD","huga");
    
  •         list.add(map);
    
  •         esSearchManager.buildList2Documents("testindex","testtypes",list);
    
  •       //传入某个字段进行不分词精确查找
    
  •        List<String> keywords = new ArrayList<>();
    
  •         keywords.add("huga");
    
  •         List<String> types = new ArrayList<>();
    
  •         types.add("testtypes");
    
  •         List<String> indexs = new ArrayList<>();
    
  •         indexs.add("testindex");
    
  •         List<String> fieldNames = new ArrayList<>();
    
  •         fieldNames.add("fieldD");
    
  •         PageEntity<JSONObject>  pg = esSearchManager.queryWithTerm(keywords,indexs,
    
  •         types,fieldNames,null,null,null,null,1,10);
    
  •        //传入某个字段进行全文检索
    
  •         List<String> keywords = new ArrayList<>();
    
  •         keywords.add("huga");
    
  •         List<String> types = new ArrayList<>();
    
  •         types.add("testtypes");
    
  •         List<String> indexs = new ArrayList<>();
    
  •         indexs.add("testindex");
    
  •         List<String> fieldNames = new ArrayList<>();
    
  •         fieldNames.add("fieldD");
    
  •         PageEntity<JSONObject> pg1  = esSearchManager.queryFulltext(keywords,
    
  •                 indexs, types, fieldNames,
    
  •                 null, 1,10);
    

以上总结了部分es基本操作API和调用demo,详细的代码请查看github地址 https://github.com/winstonelei/BigDataTools ,包括了一些大数据组件的基本操作,包含了hbase,hadoop,es,hive等

© 著作权归作者所有

winstone
粉丝 38
博文 14
码字总数 17575
作品 0
南京
程序员
私信 提问
elasticsearch搜索引擎相关资料(更新中)

最近需要用到elasticsearch搜索引擎,所以搜集了很多相关资料,先放在这里(未详细整理) 一、步骤总结:(linux环境下) 1. 安装 (1)下载elasticsearch安装包:http://www.elasticsearch....

核桃人
2018/03/08
0
0
Elasticsearch插件一——-head插件安装详解(Elasticsearch教程08)|MVP讲堂

作者:阿里云MVP 铭毅 往期内容: 死磕 Elasticsearch 方法论:普通程序员高效精进的 10 大狠招! Elasticsearch学习,请先看这一篇!(Elasticsearch教程01) Elasticsearch增、删、改、查操...

辰悠
2018/12/14
0
0
ES(elasticsearch)搜索引擎

ES(elasticsearch)搜索引擎 0、授人以渔,少走半年弯路! 死磕 Elasticsearch 方法论:普通程序员高效精进的 10 大狠招! 一、Elasitcsearch基础篇 1.1 Elasitcsearch基础认知 1、Elasticse...

Ocean_K
2018/09/11
1K
6
spring-data-elasticsearch 基本案例详解(三)

『 风云说:能分享自己职位的知识的领导是个好领导。 』 运行环境:JDK 7 或 8,Maven 3.0+ 技术栈:SpringBoot 1.5+, Spring Data Elasticsearch 1.5+ ,ElasticSearch 2.3.2 本文提纲 一、...

夜黑人模糊灬
2018/05/13
870
1
Elasticsearch简介与实战

什么是Elasticsearch?   Elasticsearch是一个开源的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。   Lucene 可以说是当下最先进、高性能、全功能的搜索引...

但盼风雨来_jc
03/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
今天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
今天
6
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
今天
4
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.5K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部