ElasticSearch基础概念

基础概念

elasticsearch 是面向 文档存储 的,可以是数据库中的一条商品数据,一个订单信息。
文档数据会被序列化为 json 格式后存储在 elasticsearch 中。

索引

类似Mysql中的表

同类型文档的集合

文档

类似于Mysql中的行数据

一条数据就是一个文档,es中是Json格式

字段

类似于数据库中的列数据

Json文档中的字段

映射

类似于Mysql中的Schema,表结构

索引中文档的约束,比如字段名称,类型

正向索引

Mysql 采用正向索引:基于文档 id 创建索引。查询词条时必须先找到文档,而后判断是否包含搜索的内容

倒排索引

elasticsearch 采用倒排索引:
文档(document):每条数据就是一个文档
词条(term):文档按照语义分成的词语

ES索引库基本操作

创建索引库

mapping 属性

mapping 是对索引库中文档的约束,常见的 mapping 属性包括:
type:字段数据类型,常见的简单类型有:
字符串:text(可分词的文本),keyword(精确值,例如:品牌,国家,邮箱)
数值:long、integer、short、byte、double、float、
布尔:boolean
日期:date
对象:object index:是否创建索引参与搜索,默认为 true,如果不需要参与搜索设置为 false
analyzer:使用哪种分词器

创建索引库和 mapping 的语法如下:

复制代码
PUT /news
{
  "mappings": {
    "properties": {
      "id":{
        "type": "keyword",
        "index": false
      },
      "title":{
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "img":{
        "type": "keyword",
        "index": false
      },
      "operTime":{
        "type": "date",
        "index": false
      }
    }
  }
}

查询索引库

语法: GET /索引库名
实例: GET /news

删除索引库

语法: DELETE /索引库名
实例: DELETE /news

修改索引库

索引库和mapping一旦创建无法修改,但是可以添加新的字段

复制代码
PUT /news/_mapping
{
  "properties":{
    "count":{
      "type":"long"
    }
  }
}

ES文档操作

新增文档

复制代码
POST /索引库名/_doc/文档 id
{ "字段名 1":"值 1"
"字段名 2":"值 2"
..... }

例如:

复制代码
POST /news/_doc/1
{
  "id":1,
  "title":"三体人向地球开战",
  "img":"11111111111111111111.jpg",
  "dzcount":8888888
}

POST /news/_doc/2
{
  "id":2,
  "title":"智子被地球人捕获,用来犁地",
  "img":"11111111111111111111.jpg",
  "dzcount":88888889
}

POST /news/_doc/3
{
  "id":3,
  "title":"歌者文明向三体星系投放二向箔",
  "img":"11111111111111111111.jpg",
  "dzcount":66666666666
}

POST /news/_doc/4
{
  "id":4,
  "title":"地球通过宇宙广播毁灭了三体星系",
  "img":"11111111111111111111.jpg",
  "dzcount":66666666666
}

POST /news/_doc/5
{
  "id":5,
  "title":"歌者文明投放的二向箔导致地球毁灭",
  "img":"11111111111111111111.jpg",
  "dzcount":66666666666
}

向news中添加5条如上的文档

此时可以在ES head项目中查看添加好的数据

查询文档

语法:
GET /索引库名/_doc/文档 id

删除文档

语法:
DELETE /索引库名/_doc/文档 id

修改文档

POST /索引库名/_update/文档 id
{
"doc":{
"要修改的字段":"新值"
}
}
例如:

复制代码
POST /news/_update/1
{
  "doc":{
    "title":"三体人向地球开战,向地球投放智子"
  }
}

搜索文档

GET /news/_search
{
"query":{
"match":{
"title":" 美国 "
}
}
}
例如:

复制代码
GET /news/_search
{
  "query": {
    "match": {
      "title": "地球毁灭"
    }
  }
}

通过分词器我们可以查询到搜索内容分词后的全部搜索内容

将地球毁灭分词为地球和毁灭,分别搜索到了3条和分词相关的内容

SpringBoot集成ES

官网地址: https://www.elastic.co/guide/en/elasticsearch/client/index.html

指定版本,版本必须与安装的 ES 版本一致
< properties >
< java.version >1.8</ java.version >
< elasticsearch.version >7.6.1</ elasticsearch.version >
</ properties >
添加依赖
< dependency >
< groupId >org.elasticsearch.client</ groupId >
< artifactId >elasticsearch-rest-high-level-client</ artifactId >
</ dependency >
添加初始化 RestHighLevelClient 的配置类

java 复制代码
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ElasticSearchConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")));
        return client;
    }

}

索引库操作
创建索引库

java 复制代码
CreateIndexRequest request = new CreateIndexRequest("users");
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request,
RequestOptions.DEFAULT);

判断索引库是否存在

java 复制代码
GetIndexRequest request = new GetIndexRequest("users");
boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);

删除索引库

java 复制代码
DeleteIndexRequest indexRequest = new DeleteIndexRequest("users");
AcknowledgedResponse delete = restHighLevelClient.indices().delete(indexRequest,
RequestOptions.DEFAULT);
delete.isAcknowledged();//返回 true 删除成功,返回 false 删除失败

文档操作
添加文档

java 复制代码
//将新闻添加到 mysql 的同时,将数据同步更新到 ES,为搜索提供数据
News news = new News();
news.setId(3);
news.setTitle("美国今年要总统选择,拜登着急了");
news.setImg("aaaaasssss.jpg");
IndexRequest indexRequest = new IndexRequest("news").id(news.getId().toString());
//将对象转为 json 存进 ES
indexRequest.source(new ObjectMapper().writeValueAsString(news),XContentType.JSON);
restHighLevelClient.index(indexRequest,RequestOptions.DEFAULT);修改文档
News news = new News();
news.setId(3);
news.setTitle("中国航母开往美国,准备开战,拜登着急了");
news.setImg("dddddddddddd.jpg");
UpdateRequest updateRequest = new UpdateRequest("news",news.getId().toString());
updateRequest.doc(new ObjectMapper().writeValueAsString(news), XContentType.JSON);
restHighLevelClient.update(updateRequest,RequestOptions.DEFAULT);

查询文档

java 复制代码
GetRequest getRequest = new GetRequest("news","1");
GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
//获取查询的内容,返回 json 格式
String json = getResponse.getSourceAsString();
//使用 jackson 组件将 json 字符串解析为对象
News news = new ObjectMapper().readValue(json, News.class);

删除文档

java 复制代码
DeleteRequest deleteRequest = new DeleteRequest("news","1");
DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);

搜索文档

java 复制代码
SearchRequest searchRequest = new SearchRequest("news");
SearchRequest searchRequest = new SearchRequest("news");
//精确条件查询
searchRequest.source().query(QueryBuilders.termQuery("title","美国"));
//发送查询请求
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//接收查询结果
SearchHits hits = search.getHits();
//组装查询结果
ArrayList<News> list = new ArrayList<>();
//取出结果集
for (SearchHit searchHit : hits.getHits()){
String json = searchHit.getSourceAsString();
News news = new ObjectMapper().readValue(json,News.class);
list.add(news);
}
相关推荐
AD钙奶-lalala36 分钟前
Mac OS上搭建 http server
java
知识分享小能手1 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
qq_508823403 小时前
金融量化指标--2Alpha 阿尔法
大数据·人工智能
汇能感知3 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun4 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
好家伙VCC4 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
茯苓gao4 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾4 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
皮皮林5514 小时前
SpringBoot 全局/局部双模式 Gzip 压缩实战:14MB GeoJSON 秒变 3MB
java·spring boot
weixin_456904275 小时前
Spring Boot 用户管理系统
java·spring boot·后端