Elasticsearch Java API简介

加入依赖

我本地的Elasticsearch的版本是2.1.0,因此加入相应的maven依赖

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>2.1.0</version>
</dependency>

创建Client

Elasticsearch Client分为Node Client和TransportClient。

  • Node Client:节点本身也是Elasticsearch集群的节点,也进入Elasticsearch集群和别的Elasticsearch集群中的节点一样
  • TransportClient:轻量级的Client,使用Netty线程池,Socket连接到ES集群。本身不加入到集群,只作为请求的处理

一般我们使用TransportClient。创建Client的实例如下:

    private TransportClient client = null;

    @Before
    public void createElaCLient() throws UnknownHostException {
        //如果集群是默认名称的话可以不设置集群名称
        Settings settings = Settings.settingsBuilder().put("cluster.name","elasticsearch").build();
        client = TransportClient.builder().settings(settings).build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("master"),9300));
    }

    /**
     * 关闭ela客户端
     */
    @After
    public void closeElaClient(){
        if(client != null){
            client.close();
        }
    }

client.transport.sniff嗅探功能

你可以设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中,这样做的好处是一般你不用手动设置集群里所有集群的ip到连接客户端,它会自动帮你添加,并且自动发现新加入集群的机器。代码实例如下:

    private TransportClient client = null;

    @Before
    public void createElaCLient() throws UnknownHostException {
        //如果集群是默认名称的话可以不设置集群名称
        Settings settings = Settings.settingsBuilder().put("cluster.name","elasticsearch").put("client.transport.sniff",true).build();
        client = TransportClient.builder().settings(settings).build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("master"),9300));
    }

注意:当ES服务器监听使用内网服务器IP而访问使用外网IP时,不要使用client.transport.sniff为true,在自动发现时会使用内网IP进行通信,导致无法连接到ES服务器,而直接使用addTransportAddress方法进行指定ES服务器

测试Client连接到Elasticsearch集群

代码如下:

@Test
    public void testConnection(){
        List<DiscoveryNode> discoveryList = client.connectedNodes();
        for(DiscoveryNode node : discoveryList){
            System.out.println(node.getName());
        }
    }

创建/删除Index和Type信息

    /**
     * 创建索引
     */
    @Test
    public void createIndex(){
        if(client != null){
            client.admin().indices().create(new CreateIndexRequest("test_index")).actionGet();
        }
    }

    /**
     * 清除索引
     */
    @Test
    public void clearIndex(){
        IndicesExistsResponse indicesExistsResponse = client.admin().indices().exists(new IndicesExistsRequest("test_index")).actionGet();
        if(indicesExistsResponse.isExists()){
            client.admin().indices().delete(new DeleteIndexRequest("test_index")).actionGet();
        }
    }

    /**
     * 定义索引的映射类型(mapping)
     */
    @Test
    public void defineIndexTypeMapping(){
        try {
            XContentBuilder builder = XContentFactory.jsonBuilder();
            builder.startObject()
                    .startObject("test")
                    .startObject("properties")
                    .startObject("id").field("type","long").field("store","yes").endObject()
                    .startObject("name").field("type","string").field("store","yes").field("index","not_analyzed").endObject()
                    .endObject()
                    .endObject()
                    .endObject();
            PutMappingRequest mappingRequest = Requests.putMappingRequest("test_index").type("test").source(builder);
            client.admin().indices().putMapping(mappingRequest).actionGet();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除index下的某个type
     */
    @Test
    public void deleteType(){
        if(client != null){
            client.prepareDelete().setIndex("test_index").setType("test").execute().actionGet();
        }
    }

这里自定义了某个Type的索引映射(Mapping),默认ES会自动处理数据类型的映射:针对整型映射为long,浮点数为double,字符串映射为string,时间为date,true或false为boolean。

注意:针对字符串,ES默认会做“analyzed”处理,即先做分词、去掉stop words等处理再index。如果你需要把一个字符串做为整体被索引到,需要把这个字段这样设置:field(“index”, “not_analyzed”)。

索引数据

    /**
     * 批量索引
     */
    @Test
    public void indexData(){
        BulkRequestBuilder requestBuilder = client.prepareBulk();
        for(Person person : personList){
            String obj = getIndexDataFromHotspotData(person);
            if(obj != null){
                requestBuilder.add(client.prepareIndex("test_index","test",String.valueOf(person.getId())).setRefresh(true).setSource(obj));
            }
        }
        BulkResponse bulkResponse = requestBuilder.execute().actionGet();
        if(bulkResponse.hasFailures()){
            Iterator<BulkItemResponse> it = bulkResponse.iterator();
            while(it.hasNext()){
                BulkItemResponse itemResponse = it.next();
                if(itemResponse.isFailed()){
                    System.out.println(itemResponse.getFailureMessage());
                }
            }
        }
    }

    /**
     * 单个索引数据
     * @return
     */
    @Test
    public void indexHotspotData() {
        String jsonSource = getIndexDataFromHotspotData(new Person(1004,"jim"));
        if (jsonSource != null) {
            IndexRequestBuilder requestBuilder = client.prepareIndex("test_index",
                    "test").setRefresh(true);
            requestBuilder.setSource(jsonSource)
                    .execute().actionGet();
        }
    }
    public String getIndexDataFromHotspotData(Person p){
        String result = null;
        if(p != null){
            try {
                XContentBuilder builder = XContentFactory.jsonBuilder();
                builder.startObject().field("id",p.getId()).field("name",p.getName()).endObject();
                result = builder.string();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

查询数据

ES支持分页查询获取数据,也可以一次性获取大量数据,需要使用Scroll Search,QueryBuilder是一个查询条件

    public List<Long> searchData(QueryBuilder builder){
        List<Long> ids = new ArrayList<>();
        SearchResponse response = client.prepareSearch("test_index").setTypes("test").setQuery(builder).setSize(10).execute().actionGet();
        SearchHits hits = response.getHits();
        for(SearchHit hit : hits){
            Long id = (Long) hit.getSource().get("id");
            ids.add(id);
        }
        return ids;
    }

原文地址:https://www.cnblogs.com/senlinyang/p/8336242.html

时间: 2024-10-11 09:30:24

Elasticsearch Java API简介的相关文章

ElasticSearch Java Api -创建索引

ElasticSearch JAVA API官网文档:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-index.html 一.生成JSON 创建索引的第一步是要把对象转换为JSON字符串.官网给出了四种创建JSON文档的方法: 1.1手写方式生成 String json = "{" + "\"user\":\"kimchy\"

ElasticSearch Java Api -检索索引库

上篇博客记录了如何用java调用api把数据写入索引,这次记录下如何搜索. 一.准备数据 String data1 = JsonUtil.model2Json(new Blog(1, "git简介", "2016-06-19", "SVN与Git最主要的区别...")); String data2 = JsonUtil.model2Json(new Blog(2, "Java中泛型的介绍与简单使用", "2016-0

Elasticsearch Java API (二): index创建删除 cluster管理

Elasticsearch Java API (二): index创建删除 cluster管理  elastic官网有权威的java api 英文的 需要耐心看 这里整理下基本操作 创建maven工程添加依赖 <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.2.2</ver

第08章 ElasticSearch Java API

本章内容 使用客户端对象(client object)连接到本地或远程ElasticSearch集群. 逐条或批量索引文档. 更新文档内容. 使用各种ElasticSearch支持的查询方式. 处理ElasticSearch返回的错误信息. 通过发送各种管理指令来收集集群状态信息或执行管理任务. 8.3 连接到集群 8.3.1 成为ElasticSearch节点 第一种连接到ElasticSearch节点的方式是把应用程序当成ElasticSearch集群中的一个节点. Node node=no

独孤九剑之Elasticsearch Java API破剑式

0.题记之前Elasticsearch的应用比较多,但大多集中在关系型.非关系型数据库与Elasticsearch之间的同步.以上内容完成了Elasticsearch所需要的基础数据量的供给.但想要在海量的数据中找到和自己相关的业务数据,实现对已有的数据实现全文检索.分类统计等功能并应用到业务系统中,必须借助Java API来实现. 1.Elasticsearch Java API 概览Elasticsearch Java API 相关使用研究结果: 1.1 国内的博文讲解Elasticsear

ElasticSearch Java api 详解_V1.0

原英文文档:http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/index.html (各个版本的api) Search部分: 查询有两种方法:query Java API和filter Java API 首先看一个例子: import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.Se

elasticsearch java API 实现搜索样例

查看cluster.version:curl 'centos1:9200'插入:curl -XPUT 'http://localhost:9200/dept/employee/1' -d '{ "empname": "emp1"}'查看index:curl 'centos1:9200/_cat/indices?v'查看1条内容:curl 'centos1:9200/dept/employee/1?pretty'查看所有内容:curl 'centos1:9200/de

Elasticsearch Java API(八)--搜索有相同父id的子文档

需求: 搜索具有相同父id的所有子文档. 数据:    mapping:      { "mappings": { "branch": {}, "employee": { "_parent": { "type": "branch" } } } } 父文档: { "index": { "_id": "london" }} { &q

Elasticsearch java api 基本搜索部分详解

版权声明:本文非原创文章,转载出处:http://blog.csdn.net/molong1208/article/details/50512149 一.所使用版本的介绍 使用的是elasticsearch2.1.0版本,在此只是简单介绍搜索部分的api使用 二.简单的搜索 使用api的时候,基本上可以将DSL搜索的所有情况均写出来,在此给出一个最简单搜索的全部的过程以及代码,之后将对不同的搜索只是针对函数进行介绍 (1)DSL搜索 对于最简单的DSL搜索,对一个词进行搜索使用url直接进行通信