ElasticSearch基本操作

Posted HairLossException

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch基本操作相关的知识,希望对你有一定的参考价值。

文章目录

1.ElasticSearch 简介

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。可以帮助我们从海量数据中快速找到需要的内容。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的。

概念对比

mysqlElasticsearch说明
TableIndex索引(index),就是文档的集合,类似数据库的表(table)
RowDocument文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式
ColumnField字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)
SchemaMapping映射(Mapping)是索引中文档的约束,例如字段类型约束。类似数据库的表结构
SQLDSLDSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD

优点对比

  • Mysql:擅长事务类型操作,可以确保数据的安全和一致性
  • Elasticsearch:擅长海量数据的搜索、分析、计算

2.索引库操作

2.1.mapping 属性

mapping 是对索引库中文档的约束,常见的mapping属性包括

  • type:字段类型
    • 字符串:text(可分词的文本)、keyword(精确值,不可拆分的词)
    • 数值:long、integer、short、byte 、double、float
    • 布尔:boolean
    • 日期:date
    • 对象:object
  • index:是否创建倒排索引,默认为true
  • analyzer:使用哪种分词器,一般与text联合使用
  • properties:该字段的子字段

更多mapping属性可查阅Elastic官方文档

2.2.索引库CRUD

创建索引库

【语法】

PUT /索引库名

  "mappings": 
    "properties": 
      "字段名1":
        "type": "text",
        "analyzer": "ik_smart"
      ,
      "字段名2":
        "type": "object", 
        "properties": 
          "子字段":
            "type": "keyword"
          
        
      //....
    
  

【案例】

查询索引库

【语法】

GET /索引库名

【案例】

GET /why

删除索引库

【语法】

DELETE /索引库名

【案例】

DELETE /why

修改索引库

索引库只能添加新的字段,索引库一旦创建就无法修改

【案例】

PUT /索引库名/_mapping

  properties: 
    "新的字段名": 
      "type": "integer"
    
  

【案例】

3.文档操作

3.1.新增文档

【语法】

POST /索引库名称/_doc/文档id

  "字段1": "值1",
  "字段2": "值2",
  "字段3": 
    "子属性1": "值3",
    "子属性2": "值4"
  //...

【案例】

3.2查询文档

【语法】

GET /索引库/_doc/文档id

【案例】

GET /why/_doc/1

3.3删除文档

【语法】

DELETE /索引库/_doc/文档id

【案例】

DELETE /why/_doc/1

3.4修改文档

【全量修改语法】

PUT /索引库名/_doc/文档id

	"字段1": "值1",
	"字段1": "值1",
	//...

【增量修改语法】

POST /索引库名/_update/文档id

	"doc": 
		"字段名" :"新的值"
	

【案例】

两种修改方式的区别

  • 全量修改:这种方式会删除旧的文档,如果id存在就修改文档,如果id不存在就新增文档
  • 增量修改:这种方式只修改某个字段,如果id存在就修改字段,如果id不存在报404

4.RestClient

官方文档地址

4.1准备工作

一、导入工程和数据库

本文素材来自黑马张老师的视频

二、引入依赖

<properties>
	<java.version>1.8</java.version>
	<!--覆盖默认的ES版本-->
	<elasticsearch.version>7.12.1</elasticsearch.version>
</properties>

<!--ElasticSearch依赖-->
<dependency>
	<groupId>org.elasticsearch.client</groupId>
	<artifactId>elasticsearch-rest-high-level-client</artifactId>
	<version>7.12.1</version>
	</dependency>
</dependencies>

三、初始化JavaRestClient

private RestHighLevelClient client;
@BeforeEach //初始化RestHighLevelClient
void init()
	this.client = new RestHighLevelClient(RestClient.builder(
		HttpHost.create("http://192.168.140.130:9200")
	));

@AfterEach  //关闭资源
void close() throws IOException 
	this.client.close();

4.2.RestClient操作索引库

创建索引库

    @Test //创建索引库
    void testCreateHotelIndex() throws IOException 
        //1.创建Request对象
        CreateIndexRequest request = new CreateIndexRequest("hotel");
        //2.请求参数 source:创建索引库的DSL语句,xContentType:数据类型
        request.source(MAPPINF_TEMPLATE,XContentType.JSON);
        //3.发送请求,创建索引库
        client.indices().create(request, RequestOptions.DEFAULT);
    

判断索引库是否存在

    @Test //判断索引库是否存在
    void testIsExistHotelIndex() throws IOException 
        //1.创建Request对象 参数是要删除索引库的名称
        GetIndexRequest request = new GetIndexRequest("hotel");
        //3.发送请求,判断索引库是否存在
        boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println("索引库是否存在:"+exists);
    

删除索引库

    @Test //删除索引库
    void testDeleteHotelIndex() throws IOException 
        //1.创建Request对象 参数是要删除索引库的名称
        DeleteIndexRequest request = new DeleteIndexRequest("hotel");
        //3.发送请求,删除索引库
        client.indices().delete(request, RequestOptions.DEFAULT);
    

4.3.RestClient操作文档

添加文档

    @Test //添加文档
    void testAddIndexDocument() throws IOException 
        //在数据库查找数据
        Hotel hotel = hotelService.getById(61083L);
        //转化为文档类型
        HotelDoc hotelDoc = new HotelDoc(hotel);
        //1.创建request对象
        IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());
        //2.准备document文档 将对象序列化成json格式的字符串
        String source = JSON.toJSONString(hotelDoc);
        request.source(source,XContentType.JSON);
        //3.发送请求,添加文档
        client.index(request,RequestOptions.DEFAULT);
    

查询文档

    @Test //查找文档
    void testGetIndexDocument() throws IOException
        GetRequest request = new GetRequest("hotel","61083");
        GetResponse documentFields = client.get(request, RequestOptions.DEFAULT);
        String json = documentFields.getSourceAsString();
        //将json格式的字符串反序列化成对象
        HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
        System.err.println(hotelDoc);
    

更新文档

    @Test  //这是局部更新文档,全量更新文档代码与添加文档相同
    void testUpdateIndexDocument() throws IOException
        UpdateRequest request = new UpdateRequest("hotel","61083");
        request.doc(
                "price","999",
                "score","50"
        );
        client.update(request,RequestOptions.DEFAULT);
    

删除文档

   @Test  //删除文档
    void deleteIndexDocument() throws IOException
        DeleteRequest request = new DeleteRequest("hotel","61083");
        client.delete(request,RequestOptions.DEFAULT);
    

批量导入文档

    @Test  //批量导入文档
    void testMultipleAddIndexDocument() throws IOException
        //从数据库中批量查询数据
        List<Hotel> hotels = hotelService.list();
        BulkRequest request = new BulkRequest();
        for (Hotel hotel : hotels) 
            HotelDoc hotelDoc = new HotelDoc(hotel);
            request.add(new IndexRequest("hotel")
                    .id(hotelDoc.getId().toString())
                    .source(JSON.toJSONString(hotelDoc),XContentType.JSON));
        
        client.bulk(request,RequestOptions.DEFAULT);
    

以上是关于ElasticSearch基本操作的主要内容,如果未能解决你的问题,请参考以下文章

如何安装部署Elasticsearch?

ElasticSearch群集搭建介绍,实现高可用

Elasticsearch使用就是如此的简单

小猪教你搭建ES ELK(Elasticsearch/Logstash/Kibana)

学习笔记ElasticSearch(ES)基本概念和语句学习笔记

『青云志』ElasticSearch 集群服务升级 5 大功能插件