与ElasticSearch的交互
借用ElasticSearch官方说的一句话叫做 “How you talk to Elasticsearch depends on whether you are using Java.” 翻译过来就是 “ PHP语言是世界最好的语言!” : )
ElasticSearch的交互方式支持 RESTful API和以下客户端API:
- Java REST Client
- Java API
- JavaScript API
- Groovy API
- .NET API
- PHP API
- Perl API
- Python API
- Ruby API
既然PHP是世界上最好的语言,那........我们就用Java API来演示吧~!
Java API
ElasticSearch提供两种内置客户端,TransportClient & NodeClient ,需要注意的一点是javaAPI访问elasticsearch服务端口是9300
po个源码:

Transport client
轻量级的传输客户端可以将请求发送到远程集群。它本身不加入集群,但是它可以将请求转发到集群中的一个节点上。———来自《elasticsearch 权威指南》的介绍
下面我们来用java代码演示一下:
创建demo项目
新建一个maven项目,然后引入如下依赖:
<!-- 主要配置 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.1.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.44</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
获取客户端
我们先来测试一下获取TransportClient,代码如下:
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* Created by nathan.yun on 2018/1/30.
*/
public class TestClient {
private static final String host = "172.19.26.110";
private static final int port = 9300;
public static void main(String[] args) {
TransportClient client = null;
try {
client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new TransportAddress(InetAddress.getByName(host),port));
} catch (UnknownHostException e) {
e.printStackTrace();
}
// 打印客户端验证是否获取成功
System.out.println("client:" + client);
// 用完记得关闭客户端
if (client != null) client.close();
}
}
运行结果OK,log42j错误信息忽略即可,我们看client不为空就表明获取到了客户端
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. Set system property 'log4j2.debug' to show Log4j2 internal initialization logging.
client:org.elasticsearch.transport.client.PreBuiltTransportClient@6ce90bc5
Process finished with exit code 0
然后我们创建一个测试类,将获取客户端的代码准备一下:
private static final String host = "172.19.26.110";
private static final int port = 9300;
private TransportClient client = null;
@Before
public void connect(){
try {
client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new TransportAddress(InetAddress.getByName(host),port));
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
@After
public void close(){
if (client != null) client.close();
}
创建文档
创建文档索引我们可以用client对象调用prepareIndex方法,这个方法提供了3个构造方法,大家视情况调用。
- book ----- 索引名称
- java--------索引类型
- 666--------主键ID
最后一个参数可不传,不传的话elasticsearch会生成一个唯一值,这里我们为了演示方便就自己传入了。
/**
* 创建索引
*/
@Test
public void addIndex(){
JSONObject jsonObject = new JSONObject();
jsonObject.put("name","深入理解JVM原理");
jsonObject.put("version","2016");
jsonObject.put("price","50");
IndexResponse indexResponse = client.prepareIndex("book", "java", "666")
.setSource(jsonObject.toString(), XContentType.JSON).get();
System.out.printf("indexResponse:"+ JSONObject.toJSONString(indexResponse));
}
代码写完我们来看一下控制台运行结果:
indexResponse:{
"fragment":false,
"id":"666",// 索引ID
"index":"book",//索引名称
"primaryTerm":4,
"result":"CREATED",//操作类型,如果是更新操作那这里应该就是UPDATE
"seqNo":0,
"shardId":{
"id":0,
"index":{
"fragment":false,
"name":"book",
"uUID":"tAEhMmZRSlepXLFYCwa08A"
},
"indexName":"book"
},
"shardInfo":{
"failed":0,
"failures":[
],
"fragment":false,
"successful":1,
"total":2
},
"type":"java",//我们传入的类型
"version":1 // 更新次数
}
创建索引成功了,我们通过检索索引来进一步校验一下结果
检索文档
同样的道理调用prepareGet方法进行文档的查询。这里只演示简单的索引,高级搜索后面的文章会讲到。
/**
* 获取文档
*/
@Test
public void getIndex(){
GetResponse documentFields = client.prepareGet("book", "java", "666").get();
System.out.println("documentFields = " + JSONObject.toJSONString(documentFields));
}
看下结果:
{
"exists":true,
"fields":{
},
"fragment":false,
"id":"666",
"index":"book",
"source":{
"price":"50",
"name":"深入理解JVM原理",
"version":"2016"
},
"sourceAsBytes":"eyJwcmljZSI6IjUwIiwibmFtZSI6Iua3seWFpeeQhuino0pWTeWOn+eQhiIsInZlcnNpb24iOiIyMDE2In0=",
"sourceAsBytesRef":{
"childResources":[
]
},
"sourceAsMap":{
"$ref":"$.source"
},
"sourceAsString":"{"price":"50","name":"深入理解JVM原理","version":"2016"}",
"sourceEmpty":false,
"sourceInternal":{
"$ref":"$.sourceAsBytesRef"
},
"type":"java",
"version":1
}
更新文档
创建查询都没问题,下面我们修改几个数据,然后看一下结果
/**
* 修改文档
*/
@Test
public void updateIndex(){
JSONObject jsonObject = new JSONObject();
jsonObject.put("name","深入理解JVM原理 更新版");
jsonObject.put("version","2018");
jsonObject.put("price","99");
UpdateResponse response = client.prepareUpdate("book", "java", "666").setDoc(jsonObject, XContentType.JSON).get();
System.out.println("updateResponse = " + JSONObject.toJSONString(response));
// 重新查询一下
this.getIndex();
}
运行结果:
{
"fragment":false,
"id":"666",
"index":"book",
"primaryTerm":4,
"result":"UPDATED",
"seqNo":1,
"shardId":{
"id":0,
"index":{
"fragment":false,
"name":"book",
"uUID":"tAEhMmZRSlepXLFYCwa08A"
},
"indexName":"book"
},
"shardInfo":{
"failed":0,
"failures":[
],
"fragment":false,
"successful":1,
"total":2
},
"type":"java",
"version":2
}
查询更新后的结果:
{
"exists":true,
"fields":{
},
"fragment":false,
"id":"666",
"index":"book",
"source":{
"price":"99",
"name":"深入理解JVM原理 更新版",
"version":"2018"
},
"sourceAsBytes":"eyJwcmljZSI6Ijk5IiwibmFtZSI6Iua3seWFpeeQhuino0pWTeWOn+eQhiDmm7TmlrDniYgiLCJ2ZXJzaW9uIjoiMjAxOCJ9",
"sourceAsBytesRef":{
"childResources":[
]
},
"sourceAsMap":{
"$ref":"$.source"
},
"sourceAsString":"{"price":"99","name":"深入理解JVM原理 更新版","version":"2018"}",
"sourceEmpty":false,
"sourceInternal":{
"$ref":"$.sourceAsBytesRef"
},
"type":"java",
"version":2
}
删除文档
删除同理,我这里就直接贴代码了,大家自己可以试一下API
/**
* 删除文档
*/
@Test
public void deleteIndex(){
DeleteResponse deleteResponse = client.prepareDelete("book", "java", "666").get();
System.out.println("deleteResponse = " + JSONObject.toJSONString(deleteResponse));
}
好了,到目前为止java客户端对ElasticSearch的增删改查就OK了。
--------------------------------------------------------------------
NodeClient
( 待更新 )
--------------------------------------------------------------------
Elasticsearch基础入门(1)安装启动与配置
RESTful API
RESTfulAPI 是通过9200端口来和ElasticSearch服务进行通信,当然这个端口是可以配置的,具体怎么配置请移步 《ElasticSearch基础入门》安装启动与配置 。我这里是利用postman来发送http请求的,没有安装的朋友先去postman官网:https://www.getpostman.com/ 下载。
创建索引
PUT 或 POST http://172.19.26.110:9200/music/guitar/1
请求参数
| key | value |
| 索引名称 | music |
| 类型 | guitar |
| 主键 | 1 |
请求体
{
"name":"Martin D28 2017",
"price":17300
}
响应结果
{
"_index": "music",
"_type": "guitar",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
-----------------------------------------------------------------------------------------------------
我们再来试一下让ElasticSearch生成ID,来创建索引的情况
PUT 或 POST http://172.19.26.110:9200/music/guitar
请求参数
| key | value |
| 索引名称 | music |
| 类型 | guitar |
请求体
{
"name":"Martin HD28",
"price":22999
}
响应结果
{
"_index": "music",
"_type": "guitar",
"_id": "YyDDSmEB4mKbLxTdjG-_",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
大家可以观察一下响应结果里,“_id” 就成了elasticsearch默认给生成的序列了。
检索文档
GET http://172.19.26.110:9200/music/guitar/1
响应结果
{
"_index": "music",
"_type": "guitar",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"name": "Martin D28 2017",
"price": 17300
}
}
我们再查询一下elastic给生成ID的那条数据,看一下结果
GET http://172.19.26.110:9200/music/guitar/YyDDSmEB4mKbLxTdjG-_
响应结果
{
"_index": "music",
"_type": "guitar",
"_id": "YyDDSmEB4mKbLxTdjG-_",
"_version": 1,
"found": true,
"_source": {
"name": "Martin HD28",
"price": 22999
}
}
更新文档
PUT 或 POST http://172.19.26.110:9200/music/guitar/YyDDSmEB4mKbLxTdjG-_
请求参数
| key | value |
| 索引名称 | music |
| 类型 | guitar |
| 指定要更新的ID | YyDDSmEB4mKbLxTdjG-_ |
请求体
{
"name":"Martin HD28 更新啦",
"price":99999
}
响应结果
{
"_index": "music",
"_type": "guitar",
"_id": "YyDDSmEB4mKbLxTdjG-_",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
删除文档
DELETE http://172.19.26.110:9200/music/guitar/YyDDSmEB4mKbLxTdjG-_
响应结果
{
"_index": "music",
"_type": "guitar",
"_id": "YyDDSmEB4mKbLxTdjG-_",
"_version": 3,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
我们再GET方式查询一下看一下结果
GET http://172.19.26.110:9200/music/guitar/YyDDSmEB4mKbLxTdjG-_
{
"_index": "music",
"_type": "guitar",
"_id": "YyDDSmEB4mKbLxTdjG-_",
"found": false
}
说明已经被删除了,没毛病。
删除一个索引
DELETE http://172.19.26.110:9200/music
响应:
{
"acknowledged": true
}
删除索引music,会把music下的所有数据都删除。
好了,与ElasticSearch的基本交互已经差不多了,后面我们会来分享一些高级特性。
文章开篇的时候开了个小玩笑,那段话的正确翻译应该是
“和 Elasticsearch 的交互方式取决于 你是否使用 Java” 哈哈~
本文详细介绍了如何使用Java API与Elasticsearch进行交互,包括创建、检索、更新和删除文档。首先,通过Maven项目引入TransportClient相关依赖,然后创建TransportClient并连接到Elasticsearch服务器。接着,展示了创建索引、获取文档、更新文档和删除文档的示例代码。此外,还简单提及了使用RESTful API通过HTTP请求与Elasticsearch交互的方式。
906

被折叠的 条评论
为什么被折叠?



