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);
}
相关推荐
AIGC绘画3 分钟前
Spring微服务概述之spring cloud alibaba服务调用实践
java·spring·微服务
wwangxu4 分钟前
Java 面向对象基础
java·开发语言
致奋斗的我们6 分钟前
RHCE的学习(7)
linux·服务器·网络·学习·redhat·rhce·rhcsa
uzong21 分钟前
JDK高性能套路: 自旋(for(;;)) + CAS
java·后端
带刺的坐椅1 小时前
Spring SPI、Solon SPI 有点儿像(Maven 与 Gradle)
java·spring·solon·spi
冷眼看人间恩怨1 小时前
【Java】揭秘网络编程:深入探索其无尽奥秘与魅力
java·开发语言·tcp/ip·udp·tcp
孤客网络科技工作室2 小时前
深入学习 Scrapy 框架:从入门到精通的全面指南
学习·scrapy
Kalika0-02 小时前
多层感知机从零开始实现
pytorch·学习
Algorithm15762 小时前
JVM是什么,与Java的关系是什么,以及JVM怎么实现的跨平台性
java·开发语言·jvm