Elasticsearch 2.20 JAVA开发篇:索引文档操作

原创
2016/02/17 18:08
阅读数 2.8K

    既然是开发篇,主要以代码为主,辅助一些说明。所有的内容都是代码实际应该验证过的。

引入的头文件:

import static org.elasticsearch.node.NodeBuilder.nodeBuilder;

import java.io.IOException;
import java.net.InetAddress;
import java.util.Date;
import java.util.Map;
import java.util.Set;

import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.ClusterAdminClient;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.cluster.health.ClusterIndexHealth;
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.node.Node;
import static org.elasticsearch.common.xcontent.XContentFactory.*;

创建索引

XContentBuilder mapping = XContentFactory.jsonBuilder()
    .startObject()
	    .startObject("settings")
	      .field("number_of_shards", 1)//设置分片数量
	      .field("number_of_replicas", 0)//设置副本数量
	    .endObject()
	.endObject()
	.startObject()
	    .startObject(type)//type名称
	        .startObject("properties") //下面是设置文档列属性。
	           .startObject("type").field("type", "string").field("store", "yes").endObject()
	           .startObject("eventCount").field("type", "long").field("store", "yes").endObject()
			   .startObject("eventDate").field("type", "date").field("format", "dateOptionalTime").field("store", "yes").endObject()
	           .startObject("message").field("type", "string").field("index", "not_analyzed").field("store", "yes").endObject()
	        .endObject()
	    .endObject()
	.endObject();
			           
CreateIndexRequestBuilder cirb = client
		.admin()
		.indices()
		.prepareCreate(indexName)//index名称
		.setSource(mapping);

CreateIndexResponse response = cirb.execute().actionGet();
if (response.isAcknowledged()) {
	System.out.println("Index created.");
} else {
	System.err.println("Index creation failed.");
}

增加文档

IndexResponse response = client
		.prepareIndex(indexName, type, "1")
		.setSource(//这里可以直接用json字符串
				jsonBuilder().startObject()
					.field("type", "syslog")
					.field("eventCount", 1)
					.field("eventDate", new Date())
					.field("message", "secilog insert doc test")
				.endObject()).get();
System.out.println("index:"+response.getIndex()
		+" insert doc id:"+response.getId()
		+" result:"+response.isCreated());

查询文档

GetResponse response = client.prepareGet("secilog", "log", "1").get();
String source = response.getSource().toString();
long version = response.getVersion();
String indexName = response.getIndex();
String type = response.getType();
String id = response.getId();

本文由赛克蓝德(secisland)原创,转载请标明作者和出处。

修改文档

修改文档有两种方式,一种是直接修改,另一种是如果文档不存在则插入存在则修改。

第一种代码

UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index(indexName);
updateRequest.type(type);
updateRequest.id("1");
updateRequest.doc(jsonBuilder()
        .startObject()
            .field("type", "file")
        .endObject());
client.update(updateRequest).get();

第二种代码:

IndexRequest indexRequest = new IndexRequest(indexName, type, "3")
.source(jsonBuilder()
    .startObject()
    	.field("type", "syslog")
        .field("eventCount", 2)
        .field("eventDate", new Date())
        .field("message", "secilog insert doc test")
    .endObject());
UpdateRequest updateRequest = new UpdateRequest(indexName, type, "3")
    .doc(jsonBuilder()
        .startObject()
            .field("type", "file")
        .endObject())
    .upsert(indexRequest);              
client.update(updateRequest).get();

删除文档

DeleteResponse dresponse = client.prepareDelete("secilog", "log", "4").get();
boolean isFound = dresponse.isFound(); //文档存在返回true,不存在返回false;

删除索引

DeleteIndexRequest delete = new DeleteIndexRequest("secilog");
client.admin().indices().delete(delete);

    赛克蓝德(secisland)后续会逐步对Elasticsearch的最新版本的各项功能进行分析,近请期待。也欢迎加入secisland公众号进行关注

展开阅读全文
打赏
3
39 收藏
分享
加载中
您好楼主,最近需要学习这块的内容,由于第一次碰,官网的Java API运行多次都不成功,不知道一个完整的运行例子,楼主能提供一个完整的运行例子吗?最简单的例子都可以,caojiaxv@163.com谢谢!!!
2016/08/28 19:07
回复
举报
楼主可以提供完整代码吗
cool_manson@163.com
谢谢了0
2016/07/15 11:21
回复
举报
你这代码很凌乱,让人无法直视
2016/04/13 16:15
回复
举报
经典 最近这段时间 一直要在这里来研究研究
2016/04/02 22:22
回复
举报

引用来自“蜘蛛牛牛”的评论

您好,我想问一下,我想通过elasticsearch搜索到不同文档里的内容,然后返回对应的行数,文本名称。这个怎么实现。谢谢大牛了!

引用来自“赛克蓝德”的评论

通代码和通过http rest的方式是一样的,type参数支持多个,或者通配符,返回值中也会返回相应的信息,比如id等,但没有具体行数的概念,如果你想要些特殊信息,你可以把他放到document中。
谢谢你您的回答,我还想问个问题,就是怎样搜索指定文件,比如d:room.html里的内容。我建立索引然后在这里面进行搜索。eg:我搜索"内容"这个关键字,然后room.html里面所有关于内容的字就会闪亮出来?
2016/03/03 14:10
回复
举报
赛克蓝德博主

引用来自“蜘蛛牛牛”的评论

您好,我想问一下,我想通过elasticsearch搜索到不同文档里的内容,然后返回对应的行数,文本名称。这个怎么实现。谢谢大牛了!
通代码和通过http rest的方式是一样的,type参数支持多个,或者通配符,返回值中也会返回相应的信息,比如id等,但没有具体行数的概念,如果你想要些特殊信息,你可以把他放到document中。
2016/03/03 12:53
回复
举报
您好,我想问一下,我想通过elasticsearch搜索到不同文档里的内容,然后返回对应的行数,文本名称。这个怎么实现。谢谢大牛了!
2016/03/03 10:53
回复
举报
更多评论
打赏
7 评论
39 收藏
3
分享
在线直播报名
返回顶部
顶部