专栏首页王念博客elasticsearch2.2之javaApi

elasticsearch2.2之javaApi

前言:elasticsearch虽然自带rest接口,但是在真正使用过程中可能更多的是通过不同编程语言的客户端进行交互。

因为代码里有或多或少的注释,所以直接贴代码:

package elasticsearcha;

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import entity.User;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.MultiSearchResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.junit.Test;
import java.net.InetAddress;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;

/**
 * Created by wangnian on 2016/5/29.
 */
public class EsTest {

    Client client = getClient("192.168.1.55");

    //创建客户端
    public Client getClient(String host) {
        try {
            Client client = TransportClient.builder().build()
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), 9300));
            return client;
        } catch (Exception ex) {
            System.out.println(ex);
        }
        return null;
    }

    /**
     * 将对象通过jackson.databind转换成byte[]
     * 注意一下date类型需要格式化处理  默认是 时间戳
     *
     * @return
     */
    public byte[] convertByteArray(Object obj) {
        ObjectMapper mapper = new ObjectMapper(); // create once, reuse
        try {
            byte[] json = mapper.writeValueAsBytes(obj);
            return json;
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将对象通过JSONtoString转换成JSON字符串
     * 使用fastjson 格式化注解  在属性上加入 @JSONField(format="yyyy-MM-dd HH:mm:ss")
     *
     * @return
     */
    public String jsonStr(Object obj) {
        return JSON.toJSONString(obj);
    }

    /**
     * 增删改查
     *
     * @throws Exception
     */
    @Test
    public void test() throws Exception {
        Map<String, Object> json = new HashMap<String, Object>();
        json.put("name", "wangnian11");
        json.put("postDate", new Date());
        json.put("message", "trying out Elasticsearch");

        User user = new User();
        user.setId(2);
        user.setName("更新第一条");
        user.setPostDate(new Date());
        user.setMessage("这是一个测试的数据");

        IndexResponse response = client.prepareIndex("index", "user", user.getId().toString())//参数说明: 索引,类型 ,_id
                .setSource(jsonStr(user))//setSource可以传以上map string  byte[] 几种方式
                .get();
        boolean created = response.isCreated();
        System.out.println("创建一条记录:" + created);

        //删除_id为1的类型
        DeleteResponse response2 = client.prepareDelete("index", "user", "2").get();
        System.out.println("删除一条数据:" + response2.isFound());

        //更新
        UpdateResponse updateResponse = client.prepareUpdate("index", "user", "1").setDoc(jsonBuilder()
                .startObject()
                .field("name", "王念")
                .endObject())
                .get();
        System.out.println("更新一条数据:" + updateResponse.isCreated());


        //获取_id为1的类型
        GetResponse response1 = client.prepareGet("index", "user", "1").get();
        response1.getSourceAsMap();//获取值转换成map
        System.out.println("查询一条数据:" + JSON.toJSON(response1.getSourceAsMap()));
    }

    @Test
    public void test2() {
        //查询多个id的值
        MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
                .add("index", "user", "1")
                .add("index", "user", "2", "3", "4")
                .get();
        for (MultiGetItemResponse itemResponse : multiGetItemResponses) {
            GetResponse response = itemResponse.getResponse();
            if (response.isExists()) {
                String json = response.getSourceAsString();
                System.out.println(json);
            }
        }
        //搜索
        SearchResponse response = client.prepareSearch("index")//可以同时搜索多个索引prepareSearch("index","index2")
                .setTypes("user")//可以同时搜索多个类型
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(QueryBuilders.termQuery("name", "张三"))                 // Query
                .setPostFilter(QueryBuilders.rangeQuery("age").from(12).to(18))     // Filter
                .setFrom(0).setSize(2).setExplain(true)
                .execute()
                .actionGet();
        forSearchResponse(response);
        System.out.println("总共查询到有:" + response.getHits().getTotalHits());


        //多查询结果
        SearchRequestBuilder srb1 = client
                .prepareSearch().setQuery(QueryBuilders.queryStringQuery("张三")).setSize(1);
        SearchRequestBuilder srb2 = client
                .prepareSearch().setQuery(QueryBuilders.matchQuery("name", "张三")).setSize(1);

        MultiSearchResponse sr = client.prepareMultiSearch()
                .add(srb1)
                .add(srb2)
                .execute().actionGet();

        long nbHits = 0;
        for (MultiSearchResponse.Item item : sr.getResponses()) {
            SearchResponse response1 = item.getResponse();
            forSearchResponse(response1);
            nbHits += response1.getHits().getTotalHits();
        }
        System.out.println("多查询总共查询到有:" + nbHits);
    }

    public void forSearchResponse(SearchResponse response) {
        for (SearchHit hit1 : response.getHits()) {
            Map<String, Object> source1 = hit1.getSource();
            if (!source1.isEmpty()) {
                for (Iterator<Map.Entry<String, Object>> it = source1.entrySet().iterator(); it.hasNext(); ) {
                    Map.Entry<String, Object> entry = it.next();
                    System.out.println(entry.getKey() + "=======" + entry.getValue());
                }
            }
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringBoot之springfox(Swagger) spring-boot-starter-swagger

    Springfox的前身是swagger-springmvc,是一个开源的API doc框架,可以将我们的Controller的方法以文档的形式展现,基于Swa...

    王念博客
  • SpringBoot之Https

    前言:Springboot因为是内置一个tomcat,在需要安全性的情况下需要配置ssl访问。

    王念博客
  • mysql数据库SQL优化

    MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读...

    王念博客
  • 大厂程序员为了更好的满足历史数据的保存和检索往往选择这种神操作!

    ElasticSearch是一款开源的非常火爆的文档索引引擎, 大小公司都比较青睐的一款做日志检索、分析、查询的工具。

    云存储
  • Elasticsearch6.1.2源码下载和编译构建

    为了深入学习elasticsearch,研究其源码是种有效途径,本文简述了从下载到编译构建再运行起来的全部过程;

    程序员欣宸
  • Elasticsearch1.1 安装(好多坑)

    安装Elasticsearch 1.安装elasticsearch-rtf elasticsearch-rtf 是国内某大神根据 elasticsearch 安...

    98k
  • 【玩转腾讯云】Python ceil函数

    python ceil 内置函数和 int 函数有点类似,计算的结果都是得到一个整数,向上取整;

    猿说编程[Python和C]
  • java进阶|Mybatis系列文章(二)之高级用法Provider

    整个整合以及实现的过程到这里就结束了,代码的实现逻辑都在文中已标注详细说明了,这里就不再解释了,整个实现逻辑都结束了。

    后端Coder
  • 那些年初级前后端一起撕过的逼

    一个项目一开始总是出于还不错愿景,但做着做着,就越来越乱了。万丈高楼平地起,有些基础的问题解决好,后面改需求就不会那么痛苦了。

    一粒小麦
  • Springsecurity之AuthenticationEntryPoint

        org.springframework.security.web.AuthenticationEntryPoint在spring-security-we...

    克虏伯

扫码关注云+社区

领取腾讯云代金券