SpringBoot——检索

一、检索基本概念

1、ElasticSearch简介
开源的ElasticSearch (ES)是一个分布式、可扩展、实时的搜索与数据分析引擎。Spring Boot通过整合Spring Data ElasticSearch为我们提供了非常便捷的检索功能支持。

Elasticsearch 使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API(通过请求的方式进行检索),底层基于Lucene,采用多shard(分片)的方式保证数据安全,并且提供自动resharding的功能,github等大型的站点也是采用了ElasticSearch作为其搜索服务。

ElasticSearch :

  • 一个分布式的实时文档存储,每个字段 可以被索引与搜索
  • 一个分布式实时分析搜索引擎
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据

2、特点
(1)面向文档:
Elasticsearch 是 面向文档 的,意味着它存储整个对象或 文档。Elasticsearch 不仅存储文档,而且 索引 每个文档的内容,使之可以被检索。在 Elasticsearch 中,我们对文档进行索引、检索、排序和过滤—​而不是对行列数据。这是一种完全不同的思考数据的方式,也是 Elasticsearch 能支持复杂全文检索的原因。

(2)JSON序列化:
Elasticsearch 使用 JavaScript Object Notation(或者 JSON)作为文档的序列化格式。JSON 序列化为大多数编程语言所支持,并且已经成为 NoSQL 领域的标准格式。

注:
Lucene是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎(Elasticsearch)。

3、ElasticSearch架构
在这里插入图片描述
三条数据id1,2,3,每一个json数据都是一个文档。索引、类型、文档就类比于Mysql中的数据库、数据表、行列数据。

二、安装测试

1、搜索镜像

docker search elasticsearch

在这里插入图片描述
2、拉取镜像

docker pull 
ez.mirror.aliyuncs.com/library/elasticsearch

3、查看

docker images

4、运行
elasticsearch是用Java写的,在运行时会默认占用2G的堆内存空间,我们可以使用-e来限制堆内存的使用。

docker run -e ES_JAVA_OPTS="-Xms256m -Xms256m" -d 
-p 9200:9200 -p 9300:9300 --name ES01 5acf0e8da90b

elasticsearch各个节点间的通信使用9300端口,web通信检索使用9200端口

5、检查
docker ps检查是否已经运行,若没有运行查看所有容器dockers ps -a

docker ps 

6、测试
对9200、9300开放端口:关闭防火墙或者开启云服务器的端口。

访问服务器的9200端口:
在这里插入图片描述

三、elasticsearch基本使用

elasticsearch官方文档:
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

1、索引数据

向elasticsearch中存储数据

使用Postman发送数据:
发送PUT请求:http://IP地址:9200/megacorp/employee/1

{
    
    
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}

在这里插入图片描述

路径 /megacorp/employee/1 包含了三部分的信息:

  • megacorp:索引名称
  • employee:类型名称
  • 1:雇员的ID

收到响应:
在这里插入图片描述

2、检索文档

发送GET请求:http://IP地址:9200/megacorp/employee/1
在这里插入图片描述
其中的version代表了修改版本。

3、检查是否存在

发送Head请求,如果数据存在,则显示200:
在这里插入图片描述

4、删除

发送DELETE请求,删除的文档不存在,则显示404。
在这里插入图片描述

5、轻量搜索

(1)搜索所有雇员:
GET /megacorp/employee/_search

(2)搜索last_name为Smith的雇员
GET /megacorp/employee/_search?q=last_name:Smith

(3)发送查询表达式进行查询
POST /megacorp/employee/_search

{
    
    
    "query" : {
    
    
        "match" : {
    
    
            "last_name" : "Smith"
        }
    }
}

(4)全文搜索
POST /megacorp/employee/_search
搜索所有喜欢攀岩(rock climbing)的员工,match得到所有相似性结果。

{
    
    
    "query" : {
    
    
        "match" : {
    
    
            "about" : "rock climbing"
        }
    }
}

(5)短语检索
match_phrase,得到完全匹配的结果。

POST /megacorp/employee/_search

{
    
    
    "query" : {
    
    
        "match_phrase" : {
    
    
            "about" : "rock climbing"
        }
    }
}

(6)高亮搜索
POST /megacorp/employee/_search

{
    
    
    "query" : {
    
    
        "match_phrase" : {
    
    
            "about" : "rock climbing"
        }
    },
    "highlight": {
    
    
        "fields" : {
    
    
            "about" : {
    
    }
        }
    }
}

返回的响应中,about对应的搜索字段,加入了html高亮标签,方便浏览器处理。

"highlight": {
    
    
        "about": [
     "I love to go <em>rock</em> <em>climbing</em>" 
      ]}

四、SpringBoot-elasticsearch整合

最新的操作可以参考SpringBoot官方文档:https://docs.spring.io/spring-data/elasticsearch/docs/4.1.2/reference/html/#preface.metadata

1、SpringBoot集成ElasticSearch的几种方式

ES支持两种协议

  • HTTP协议,支持的客户端有Jest client和Rest client
  • Native Elasticsearch binary协议,也就是Transport client和Node client

HTTP协议:
Jest client非官方支持,在ES5.0之前官方提供的客户端只有Transport client、Node client。在5.0之后官方发布Rest client,并大力推荐。

Native Elasticsearch binary协议:
Transport client(7.0弃用)和Node client(2.3弃用)区别:这两个都是最早的两个客户端,Transport client是不需要单独一个节点。Node client需要单独建立一个节点,连接该节点进行操作,ES2.3之前有独立的API,ES2.3之后弃用该API,推荐用户创建一个节点,并用Transport client连接进行操作。

ReactiveElasticsearchClient:
The ReactiveElasticsearchClient is a non official driver based on WebClient. It uses the request/response objects provided by the Elasticsearch core project. Calls are directly operated on the reactive stack, not wrapping async (thread pool bound) responses into reactive types.

官方强烈建议使用Java High Level Rest Client,而不是Transport client。

在这里插入图片描述
Rest client分为:Java Low Level Rest Client和Java High Level Rest Client

现在SpringBoot2.4.1默认支持Java High Level Rest Client。

在这里插入图片描述

2、版本对应关系

在这里插入图片描述
在这里插入图片描述

3、引入依赖

SpringBoot默认使用SpringData elasticsearch模块进行操作。

 <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  </dependency>

4、application.properties

spring.elasticsearch.rest.uris=http://127.0.0.1:9200

5、存储数据

@Autowired
RestHighLevelClient restHighLevelClient;
    
@Test
void add() {
    
    
  Map<String, Object> map = new HashMap<String, Object>();
  map.put("id", "20190909");
  map.put("name", "测试");
  map.put("age", 22);
  try {
    
    
     IndexRequest indexRequest = new IndexRequest("content", "doc", map.get("id").toString()).source(map);
     IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
     System.out.println(indexResponse.toString());
     } catch (Exception e) {
    
    
        e.printStackTrace();
     }
}

结果:
在这里插入图片描述

6、检索数据

有点问题:

SearchRequest searchRequest = new SearchRequest().indices("content").types("doc");

7、更新数据

@Test
void update() {
    
    
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("id", "20190909");
    map.put("name", "测试-update");
    map.put("age", 22);
    try {
    
    
        UpdateRequest request = new UpdateRequest("content", "doc", map.get("id").toString()).doc(map);
        UpdateResponse updateResponse = restHighLevelClient.update(request, RequestOptions.DEFAULT);
        System.out.println(updateResponse.toString());
    } catch (Exception e) {
    
    
    }
}

数据更新之后:
在这里插入图片描述

8、获取数据

@Test
void get() {
    
    
    try {
    
    
        GetRequest request = new GetRequest("content", "doc", "20190909");
        GetResponse getResponse = this.restHighLevelClient.get(request, RequestOptions.DEFAULT);
        System.out.println(getResponse.toString());
    } catch (Exception e) {
    
    
    }
}

9、删除数据

@Test
void delete() {
    
    
   try {
    
    
     DeleteRequest request = new DeleteRequest("content", "doc", "20190909");
     DeleteResponse deleteResponse = this.restHighLevelClient.delete(request, RequestOptions.DEFAULT);
     System.out.println(deleteResponse.toString());
     } catch (Exception e) {
    
    
  }
}

参考博客:https://blog.csdn.net/qq_25012687/article/details/101050412

猜你喜欢

转载自blog.csdn.net/glpghz/article/details/112461071
今日推荐