ElasticSearch 6.x基本操作(阿里云ES实例)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 使用java操作elasticsearch

 服务搭建

阿里云可以1块钱包月:1元开通ELK            购买的时候要注意版本,活动什么时候结束就不知道了,配置也很简单,就不介绍了,不懂的可以评论问我

image.gifes1.png

es2.png

创建索引并指定数据结构相关解析

以下是在kibana中使用的,记住这种结构,也方便后面使用java来操作时更好理解相关代码。

###创建索引,指定数据结构
PUT /book
{
  "settings": {
  ###分片数
    "number_of_shards": 5,
  ###备份数
    "number_of_replicas": 1
  },
  ###指定数据结构
  "mappings": {
   ###类型  Type
    "novel":{
   ### Field
      "properties":{
    ###Field 属性名
        "name":{
###类型
          "type": "text",
###指定分词器
          "analyzer": "ik_max_word",
###指定当前Field可以被作为查询条件   默认值true
          "index": true,
###是否需要额外存储  默认值false
          "store": false
        },
        "author":{
          "type": "keyword"
        },
        "onSale":{
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss"
        },
        "descr":{
          "type": "text",
          "analyzer": "ik_max_word"
        }
      }
    }
  }
}

image.gif

image.gifes3.png


JAVA操作Elasticsearch

RestHighLevelClient方式

pom.xml

<!-- elasticsearch -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.5.4</version>
        </dependency>
        <!-- elasticsearch-rest-high-level-client -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.5.4</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>

image.gif

es4.png

ESClient

public class ESClient {
    public static RestHighLevelClient client = null;
    public static RestHighLevelClient getClient(){
        //不需要用户名和密码的认证
        //client = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1", "9200", "http")));
        //需要用户名和密码的认证
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("账号", "密码"));
        RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost("如果使用阿里云实例,这里填公网地址", 9200, "http"))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
                        return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                });
        client = new RestHighLevelClient(restClientBuilder);
        return client;
    }
}

image.gif

对索引的基本操作

在DemoOne中是对索引的一些基本操作,这里需要注意根据操作的不同,获取的request对象是不同的

import com.example.esdemo.utils.ESClient;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.junit.Test;
import java.io.IOException;
/**
 * 操作索引
 */
public class DemoOne {
    RestHighLevelClient client = ESClient.getClient();
    String index = "person";
    String type = "man";
    /**
     * 创建索引
     * @throws IOException
     */
    @Test
    public void createIndex() throws IOException {
        //准备关于索引的settings
        Settings.Builder settings = Settings.builder()
                .put("number_of_shards",3)
                .put("number_of_replicas",1);
        //准备关于索引的结构mappings
        //这里的startObject()  endObject()相当于{}   是成对出现的
        XContentBuilder mappings = JsonXContent.contentBuilder()
                .startObject()
                .startObject("properties")
                .startObject("name")
                .field("type","text")
                .endObject()
                .startObject("age")
                .field("type","integer")
                .endObject()
                .startObject("birthday")
                .field("type","date")
                .field("format","yyyy-MM-dd")
                .endObject()
                .endObject()
                .endObject();
        //把settings和mappings封装到一个Request对象中
        CreateIndexRequest request = new CreateIndexRequest(index)
                .settings(settings)
                .mapping(type,mappings);
        //通过client对象去连接es并执行创建索引
        CreateIndexResponse indexResponse = client.indices().create(request, RequestOptions.DEFAULT);
        System.out.println(indexResponse.toString());
    }
    /**
     * 检查索引是否存在
     * @throws IOException
     */
    @Test
    public void exists() throws IOException {
        //获取request对象
        GetIndexRequest request = new GetIndexRequest();
        //设置索引
        request.indices(index);
        boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println("是否存在:"+exists);
    }
    /**
     * 删除索引
     * @throws IOException
     */
    @Test
    public void delete() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest();
        request.indices(index);
        AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(response.isAcknowledged());
    }
}

image.gif

对文档的基本操作

这里先贴出Person类

public class Person {
    @JsonIgnore
    private Integer id;
    private String name;
    private Integer age;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    public Person() {
    }
    public Person(Integer id, String name, Integer age, Date birthday) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }
getter()....setter()....
}

image.gif

文档的增删改

/**
 * 操作文档
 */
public class DemoTwo {
    ObjectMapper mapper = new ObjectMapper();
    RestHighLevelClient client = ESClient.getClient();
    String index = "person";
    String type = "man";
    /**
     * 创建文档
     * @throws IOException
     */
    @Test
    public void createDoc() throws IOException {
        //准备一个json数据
        Person person = new Person(1,"张三",25,new Date());
        //序列化成json字符串
        String json = mapper.writeValueAsString(person);
        //准备request对象(手动指定id)
        IndexRequest request = new IndexRequest(index,type,person.getId().toString());
        request.source(json, XContentType.JSON);
        //通过client执行添加
        IndexResponse response = client.index(request, RequestOptions.DEFAULT);
        //返回结果
        System.out.println(response.getResult().toString());
    }
    /**
     * 修改文档
     */
    @Test
    public void updateDoc() throws IOException {
        //创建一个Map,指定需要修改的内容
        Map<String,Object> doc = new HashMap<>();
        doc.put("name","李晓明");
        //在创建时指定了id是1
        String docId = "1";
        //创建request对象,封装数据
        UpdateRequest request = new UpdateRequest(index, type, docId);
        request.doc(doc);
        //通过client对象去执行
        UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
        //输出返回结果
        System.out.println(response.getResult().toString());
    }
    /**
     * 删除文档
     * @throws IOException
     */
    @Test
    public void deleteDoc() throws IOException {
        String docId = "1";
        DeleteRequest request = new DeleteRequest(index, type, docId);
        DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
        System.out.println(response.getResult().toString());
    }
}

image.gif

image.gifes5.png

但是一个一个太慢了,来看一下批量操作文档,还是在Demo2中测试

/**
     * 批量创建文档
     */
    @Test
    public void bulkCreateDoc() throws IOException {
        //准备数据
        Person p1 = new Person(1,"李四",23,new Date());
        Person p2 = new Person(2,"王五",24,new Date());
        Person p3 = new Person(3,"麻溜",25,new Date());
        ArrayList<Person> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        //创建request,把准备好的数据封装进去
        BulkRequest bulkRequest = new BulkRequest();
        list.forEach(item -> {
            try {
                String json = mapper.writeValueAsString(item);
                bulkRequest.add(new IndexRequest(index,type,item.getId().toString()).source(json,XContentType.JSON));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        });
        //用client执行
        BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        //输出返回结果
        System.out.println(response.toString());
    }
 /**
     * 批量删除文档
     * @throws IOException
     */
    @Test
    public void bulkDeleteDoc() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.add(new DeleteRequest(index,type,"1"));
        bulkRequest.add(new DeleteRequest(index,type,"2"));
        BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(response.toString());
    }

image.gif

image.gifes6.png


ElasticSearch的各种查询  单独放在下一篇记录

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
3月前
|
数据可视化 Java Windows
Elasticsearch入门-环境安装ES和Kibana以及ES-Head可视化插件和浏览器插件es-client
本文介绍了如何在Windows环境下安装Elasticsearch(ES)、Elasticsearch Head可视化插件和Kibana,以及如何配置ES的跨域问题,确保Kibana能够连接到ES集群,并提供了安装过程中可能遇到的问题及其解决方案。
Elasticsearch入门-环境安装ES和Kibana以及ES-Head可视化插件和浏览器插件es-client
|
1天前
|
机器学习/深度学习 人工智能 运维
阿里云技术公开课直播预告:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot
阿里云技术公开课预告:Elastic和阿里云搜索技术专家将深入解读阿里云Elasticsearch Enterprise版的AI功能及其在实际应用。
阿里云技术公开课直播预告:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot
|
4天前
|
存储 人工智能 API
(Elasticsearch)使用阿里云 infererence API 及 semantic text 进行向量搜索
本文展示了如何使用阿里云 infererence API 及 semantic text 进行向量搜索。
|
2月前
|
存储 人工智能 自然语言处理
Elasticsearch Inference API增加对阿里云AI的支持
本文将介绍如何在 Elasticsearch 中设置和使用阿里云的文本生成、重排序、稀疏向量和稠密向量服务,提升搜索相关性。
90 14
Elasticsearch Inference API增加对阿里云AI的支持
|
5月前
|
存储 自然语言处理 算法
面试题ES问题之Solr和Elasticsearch功能实现如何解决
面试题ES问题之Solr和Elasticsearch功能实现如何解决
63 2
|
2月前
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
214 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
|
2月前
|
自然语言处理 搜索推荐 Java
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(一)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图
57 0
|
2月前
|
存储 自然语言处理 搜索推荐
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
39 0
|
3月前
|
JSON 自然语言处理 数据库
ElasticSearch基础1——索引和文档。Kibana,RestClient操作索引和文档+黑马旅游ES库导入
概念、ik分词器、倒排索引、索引和文档的增删改查、RestClient对索引和文档的增删改查
ElasticSearch基础1——索引和文档。Kibana,RestClient操作索引和文档+黑马旅游ES库导入
|
5月前
|
负载均衡 监控 搜索推荐
面试题ES问题之Solr和Elasticsearch在分布式管理上如何解决
面试题ES问题之Solr和Elasticsearch在分布式管理上如何解决
43 1