Elasticsearch基础入门(2)elasticsearch的交互

本文详细介绍了如何使用Java API与Elasticsearch进行交互,包括创建、检索、更新和删除文档。首先,通过Maven项目引入TransportClient相关依赖,然后创建TransportClient并连接到Elasticsearch服务器。接着,展示了创建索引、获取文档、更新文档和删除文档的示例代码。此外,还简单提及了使用RESTful API通过HTTP请求与Elasticsearch交互的方式。

与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

请求参数    

keyvalue
索引名称 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

请求参数    

keyvalue
索引名称 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-_

请求参数    

keyvalue
索引名称 music
类型guitar
指定要更新的IDYyDDSmEB4mKbLxTdjG-_

请求体 

{
"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”  哈哈~

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值