`
donlianli
  • 浏览: 336634 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
Elasticsearch...
浏览量:216733
社区版块
存档分类
最新评论

ElasticSearch入门-Bulk,Search操作

阅读更多

转载请标明出处:http://donlianli.iteye.com/blog/1902840

 

其实在上一篇博客中,只要大家能看懂,就应该能够根据其代码做到举一反三了,依次类推ES的批量操作Bulk,搜索功能Search等,但在这里还是简单讲一下。

 

批量索引和删除

 

BulkRequestBuilder bulkRequest = client.prepareBulk();
		for(int i=500;i<1000;i++){
			//业务对象
			String json = ESUtils.toJson(new LogModel());
			IndexRequestBuilder indexRequest = client.prepareIndex("twitter", "tweet")
			//指定不重复的ID		
	        .setSource(json).setId(String.valueOf(i));
			//添加到builder中
			bulkRequest.add(indexRequest);
		}
		
		BulkResponse bulkResponse = bulkRequest.execute().actionGet();
		if (bulkResponse.hasFailures()) {
		    // process failures by iterating through each bulk response item
			System.out.println(bulkResponse.buildFailureMessage());
		}

 上面只是批量索引的方法,将client.prepareIndex改为client.prepareDelete就是批量删除操作。ES对批量操作作了优化,所以大家使用时,尽量将操作集中起来调用批量接口,速度会更快一些。

 

 

搜索(Search)

这里说的搜索仅仅是简单相等条件搜索,并没有涉及真正意义上的搜索。比如,我们要搜索前1000条记录,代码如下:

 

SearchResponse response = client.prepareSearch("twitter")
//这个在prepareSearch中指定还不行,必须使用setTypes
				.setTypes("tweet")
				//设置查询条件,
		        .setFilter(FilterBuilders.matchAllFilter())
		        .setFrom(0).setSize(1000)
		        .execute()
		        .actionGet();
		/**
		 * SearchHits是SearchHit的复数形式,表示这个是一个列表
		 */
		SearchHits shs = response.getHits();
		for(SearchHit hit : shs){
			System.out.println("id:"+hit.getId()+":"+hit.getSourceAsString());
		}
		client.close();

 搜索有两种方法,一种是使用Filter进行搜索,一种是使用Query进行搜索,例如,想只搜索某个字段为具体值的数据,也可以这样写。

 

 

Client client = ESUtils.getClient();
		/**
		 * 创建查询条件,QueryBuilders相当于Hibernate的Restrictions,
		 * 而QueryBuilder则相当于一个Criteria,可以不停的增加本身对象
		 */
		BoolQueryBuilder query = QueryBuilders.boolQuery();
                 //systemName为字段名称,oa未字段值
		query.must(QueryBuilders.termQuery("systemName", "oa"));
		SearchResponse response = client.prepareSearch("twitter")
//这个在prepareSearch中指定还不行,必须使用setTypes
				.setTypes("tweet")
				//设置查询条件,
		        .setQuery(query)
		        .setFrom(0).setSize(60)
		        .execute()
		        .actionGet();
		/**
		 * SearchHits是SearchHit的复数形式,表示这个是一个列表
		 */
		SearchHits shs = response.getHits();
		for(SearchHit hit : shs){
			System.out.println(hit.getSourceAsString());
		}
		client.close();

 

 

这些只是使用ES的传统用法,就是想用ES取代传统数据库的用法。但其实ES的主要目的并非如此,相信你使用搜索引擎也不是想做这些简单的查询和插入。排名,分词等更高级的用法,我也没有完全搞清楚,还望大家多多指教。

 

 

 

 

对这类话题感兴趣?欢迎发送邮件至donlianli@126.com
关于我:邯郸人,擅长Java,Javascript,Extjs,oracle sql。
更多我之前的文章,可以访问 我的空间

 

1
1
分享到:
评论
3 楼 donlianli 2014-01-06  
Tongqing-Qiu 写道
不错。我也在用ES。我们是用REST API进行操作。能说说Java API和REST API,你觉得如何取舍吗?

个人觉得使用Java程序的话,最好还是原生的api接口,如果使用REST API,中间岂不多了一层转换的步骤?
2 楼 Tongqing-Qiu 2014-01-06  
不错。我也在用ES。我们是用REST API进行操作。能说说Java API和REST API,你觉得如何取舍吗?
1 楼 tanjianna 2013-07-11  
LZ 嘔心瀝血啊!不錯!建議用spring-data-elasticsearch 可以學習學習!url:https://github.com/SpringSource/spring-data-elasticsearch

相关推荐

Global site tag (gtag.js) - Google Analytics