ElasticSearch入门-Bulk,Search操作

2019-03-11 09:12|来源: 网络

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

批量索引和删除

Java代码
  1. BulkRequestBuilder bulkRequest = client.prepareBulk();  

  2.        for(int i=500;i<1000;i++){  

  3.            //业务对象  

  4.            String json = ESUtils.toJson(new LogModel());  

  5.            IndexRequestBuilder indexRequest = client.prepareIndex("twitter", "tweet")  

  6.            //指定不重复的ID        

  7.            .setSource(json).setId(String.valueOf(i));  

  8.            //添加到builder中  

  9.            bulkRequest.add(indexRequest);  

  10.        }  

  11.          

  12.        BulkResponse bulkResponse = bulkRequest.execute().actionGet();  

  13.        if (bulkResponse.hasFailures()) {  

  14.            // process failures by iterating through each bulk response item  

  15.            System.out.println(bulkResponse.buildFailureMessage());  

  16.        }  


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

搜索(Search)

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

Java代码
  1. SearchResponse response = client.prepareSearch("twitter")  

  2. //这个在prepareSearch中指定还不行,必须使用setTypes  

  3.                .setTypes("tweet")  

  4.                //设置查询条件,  

  5.                .setFilter(FilterBuilders.matchAllFilter())  

  6.                .setFrom(0).setSize(1000)  

  7.                .execute()  

  8.                .actionGet();  

  9.        /**

  10.         * SearchHits是SearchHit的复数形式,表示这个是一个列表

  11.         */  

  12.        SearchHits shs = response.getHits();  

  13.        for(SearchHit hit : shs){  

  14.            System.out.println("id:"+hit.getId()+":"+hit.getSourceAsString());  

  15.        }  

  16.        client.close();  


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

Java代码
  1. Client client = ESUtils.getClient();  

  2.        /**

  3.         * 创建查询条件,QueryBuilders相当于Hibernate的Restrictions,

  4.         * 而QueryBuilder则相当于一个Criteria,可以不停的增加本身对象

  5.         */  

  6.        BoolQueryBuilder query = QueryBuilders.boolQuery();  

  7.                 //systemName为字段名称,oa未字段值  

  8.        query.must(QueryBuilders.termQuery("systemName", "oa"));  

  9.        SearchResponse response = client.prepareSearch("twitter")  

  10. //这个在prepareSearch中指定还不行,必须使用setTypes  

  11.                .setTypes("tweet")  

  12.                //设置查询条件,  

  13.                .setQuery(query)  

  14.                .setFrom(0).setSize(60)  

  15.                .execute()  

  16.                .actionGet();  

  17.        /**

  18.         * SearchHits是SearchHit的复数形式,表示这个是一个列表

  19.         */  

  20.        SearchHits shs = response.getHits();  

  21.        for(SearchHit hit : shs){  

  22.            System.out.println(hit.getSourceAsString());  

  23.        }  

  24.        client.close();  

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

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

 
转自:http://donlianli.iteye.com/blog/1902840

相关问答

更多
  • 电脑基础入门操作 《电脑基础入门操作》是2009年怡丹、泽雨编著的一本图书。读者通过丛书的学习,可以轻松开启学习电脑知识的大门,揭秘网络世界,还能够深入到电脑的中枢,成为电脑应用的高手。 内容简介 编辑 新世纪的曙光,照耀着人类美好生活的前景,作为时代发展 和进步的标志,电脑已经与人们息息相关,朝夕与共。学习电脑 和应用电脑的热潮已在中华大地火热掀起,新版《红色至尊电脑 掌中宝》丛书则为急切渴望学习电脑操作的读者指引了方向。 《红色至尊电脑掌中宝》是一套共30册的大型实用电脑丛书。它囊括了电脑及其网络的基础 ...
  • 电脑办公的入门操作:文件的复制,移动,重命名等!然后输入法的切换使用等!最重要的是你要回office的基本操作!
  • 您在名称前缺少引号。 { "index": 1, "name" : "my_value" } You are missing the quotes before name. { "index": 1, "name" : "my_value" }
  • 尝试从SQL数据库中传输数据时,最好的选择是使用Logstash的JDBC Input为您 ( 文档 )执行此操作。 希望能为您完成所有这一切。 并非所有SQL方案都能让这一切变得简单,因此针对您的具体问题 如果文档存在,如何使用批量更新文档,如果文档不在批量内而不知道文档是否存在于索引中,则创建文档。 Bulk目前接受四种不同类型的子请求 ,其行为与您可能期望来自SQL世界的行为不同: index create update delete 第一个index是最常用的选项。 这意味着您想要将(动词)索引到E ...
  • 正如文件中所写: 它返回一个包含摘要信息的元组 - 如果stats_only设置为True,则成功执行的操作的数量以及错误列表或错误数量[...]如果需要处理大量数据并希望忽略/收集错误,请考虑使用streaming_bulk()帮助程序,它只会返回错误而不会将它们存储在内存中。 使用streaming_bulk(),你必须使用raise_on_error参数来提升错误。 如果你想收集大量数据,我建议使用更快,更直观的parallel_bulk() As written in documentation: ...
  • 是的,您可以使用多搜索API和/_msearch端点一次发送/_msearch查询。 curl -XPOST localhost:9200/_msearch -d ' {"index" : "test1"} {"query" : {"match_all" : {}}, "from" : 0, "size" : 10} {"index" : "test2"} {"query" : {"match_all" : {}}} ' 您将获得一个responses数组,其中每个查询的响应顺序与请求中的顺序相同。 注意 ...
  • 正确的做法是这样的: @Grab(group='org.elasticsearch', module='elasticsearch-groovy', version='1.7.0') import org.elasticsearch.client.Client import org.elasticsearch.node.Node import static org.elasticsearch.node.NodeBuilder.nodeBuilder import org.elasticsearch.ac ...
  • 我想我明白了(..) 在索引函数中,我需要使用以下命令来启用前缀完成提示器: name_suggest = self.name 代替: name_suggest = {'input': something.here } 这似乎被用于更多的定制案例。 感谢帮助这个视频 ! I think I figured it out (..phew) In the indexing function, I need to use the following to enable to the prefix comple ...
  • 正如@Val所提到的,你应该在json体的最后一行的末尾加上新行字符\n : {"index":{"_id":"1"}} {"name": "John Doe" } {"index":{"_id":"2"}} {"name": "Jane Doe" }\n 正如bulk_api中提到的那样 。 希望能帮助到你! As @Val mentioned, you should be having the new line character \n at the end of the last line in y ...