编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

ES 基本知识(es基本介绍)

wxchong 2024-10-23 15:51:04 开源技术 7 ℃ 0 评论

文档和字段

ElasticSearch面向文档存储。文档内容会序列化为JSON格式用于存储。

JSON格式中有许多字段(field)相当于数据库中的列。

索引和映射

索引(index): 同一类型文档的集合。

对应于关系型数据库,就类似于关系型数据库中的表。

映射(mapping): 文档字段的约束信息。

对于关系型数据库,就类似于表结构约束。

MySql 与 ElasticSearch 结构对比

MySQL

ElasticSearch

table

index

Schema

mapping

row

document

column

field

分词器

  • 作用

创建倒排索引时对文档内容进行分词。

用户搜索时,对搜索内容进行分词。

  • IK分词器:

ik_smart: 分词力度粗

ik_max_word:分词力度细

  • IK分词器拓展词条 和 停用词条

es中config目录中IKAnalyzer.cfg.xml文件中添加扩展词典 和 停用词典。

词典中添加对应词条。

ES创建索引库

索引库类似于表,mapping映射类似于表结构。

  • mapping 映射属性
  1. type:字段数据类型,常见的简单类型有:

字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)

数值:long、integer、short、byte、double、float、

布尔:boolean

日期:date

对象:object

地理坐标: geo_point(纬度 经度)、geo_shape

2.index:是否创建索引,默认true

3.analyzer:使用分词器类型

4.properties: 该字段子字段

5.copy_to: 组合字段,合并多个字段值,用于搜索等。。。

ES操作索引库

创建索引库和映射

PUT /索引库名称
{
	"mappings": {
  				"properties": {
          			"字段1":{
                			"type": "text",
                        "analyzer": "ik_smart"
                },
                 "字段2":{
                			"type": "keyword",
                        "index": "false"
                },
                  "字段3":{
                		 "properties": {
                     			"子字段":{
                          			"type" : "keyword"
                          }
                     },
                      //...........
                },
          }
  }
}

查询索引库

GET /索引库名

修改索引库

注意:索引库创建完成后,就不能修改已有字段mapping。

但是,新添加的字段到mapping,是可以的。

PUT /索引库名称/_mapping
{
	"properties": {
  			"新字段名": {
        		"type": "数据类型"
        }
  }
}

删除索引库

DELETE /索引库名


小结:

创建索引库: PUT /索引库名称

查询索引库: GET /索引库名称

修改索引库: PUT /索引库名称/_mapping

删除索引库: DELETE /索引库名称


文档操作

新增文档

POST /索引库名称/_doc/文档ID
{
		"字段1": "值1",
      "字段2: "值2",
      "字段3: {
							"子字段1:"值3",
               "子字段2":"值4"
				},
         ..............
}

查询文档

GET /索引库名称/_doc/{id}

删除文档

DELETE /索引库名称/_doc/id值

修改文档

全量修改:直接覆盖源文档

增量修改: 修改部分字段

全量修改

PUT /索引库名称/_doc/文档ID
{
 		"字段1":"值1", 
     "字段1":"值1", 
       .....
}

增量修改

POST /索引库名称/_update/文档ID
{
			"doc": {
      		"字段名":"新值",
            ....
      }
}

小结:

创建文档: PSOT /索引库名称/_doc/文档ID

查询文档: GET /索引库名称/_doc/文档ID

删除文档: DELETE /索引库名称/_doc/文档ID

修改文档:

全量修改: PUT /索引库名称/_doc/文档ID

增量修改: POST /索引库名称/_update/文档ID {"doc" : {}}

RestClient操作ES

准备工作:

引入依赖

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

如果springBoot中ES版本与使用的版本不一致,可以覆盖ES版本。


初始化客户端:

RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
        HttpHost.create("IP:9200")
));

..........

client.close();


创建索引库

//创建Request对象
 CreateIndexRequest request = new CreateIndexRequest("索引库名称");
//准备DSL语句
request.source( DSL语句 , XContentType.JSON);
//发送请求
client.indices().create(request,RequestOptions.DEFAULT);

删除索引库

// 1.创建Request对象
    DeleteIndexRequest request = new DeleteIndexRequest("索引库名称");
    // 2.发送请求
    client.indices().delete(request, RequestOptions.DEFAULT);

判断索引库是否存在

// 1.创建Request对象
    GetIndexRequest request = new GetIndexRequest("索引库名称");
    // 2.发送请求
    boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);

小结:

核心是client.indices()方法来获取索引库的操作对象。

RestClient操作文档

新增文档

// 1.准备Request对象
    IndexRequest request = new IndexRequest("索引库名称").id("文档ID");
    // 2.准备Json文档
    request.source( json格式的数据字符串 ,  XContentType.JSON);
    // 3.发送请求
    client.index(request, RequestOptions.DEFAULT);

查询文档

// 1.准备Request
    GetRequest request = new GetRequest("索引库名称", "文档ID");
    // 2.发送请求,得到响应
    GetResponse response = client.get(request, RequestOptions.DEFAULT);
    // 3.解析响应结果
    String json = response.getSourceAsString();

删除文档

// 1.准备Request
    DeleteRequest request = new DeleteRequest("索引库名称", "文档ID");
    // 2.发送请求
    client.delete(request, RequestOptions.DEFAULT);

修改文档

 // 1.准备Request
    UpdateRequest request = new UpdateRequest("索引库名称", "文档ID");
    // 2.准备请求参数
    request.doc(
        "key1", "value1",
        "key2", "value2"
    );
    // 3.发送请求
    client.update(request, RequestOptions.DEFAULT);

批量导入

// 创建Request
    BulkRequest request = new BulkRequest();
 // 2.2.创建新增文档的Request对象
        request.add(new IndexRequest("索引库名称")
                    .id("文档ID")
                    .source("JSON格式数据", XContentType.JSON));


小结:

ES使用倒排序的方式,解决了关键字快速匹配并且找到相关数据的问题。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表