网络知识 娱乐 springboot整合全文搜索引擎Elasticsearch | Spring Boot 28

springboot整合全文搜索引擎Elasticsearch | Spring Boot 28

🍅 作者简介:CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪

🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

🍅 关注公众号【哪吒编程】,回复1024,获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步

目录

    • 一、Elasticsearch简介
    • 二、下载与安装
      • 1、Elasticsearch官网下载地址
      • 2、下载成功
      • 3、双击elasticsearch.bat启动
      • 4、启动成功
    • 三、数据格式
    • 四、索引
      • 1、创建索引
      • 2、查询索引
      • 3、删除索引
    • 五、文档
      • 1、创建文档
      • 2、查询文档
    • 六、复杂查询
      • 1、指定条件查询
      • 2、多条件查询
      • 3、部分词汇匹配查询
      • 4、聚合查询
    • 七、代码实例
      • 1、引入pom
      • 2、添加索引
      • 3、运行出错
      • 4、查询索引
      • 5、插入文档
      • 6、批量插入文档
      • 7、根据条件查询文档中全部数据
      • 8、按条件查询
      • 9、分页查询
      • 10、按年龄排序
      • 11、按条件查询
      • 12、组合条件查询
      • 13、模糊查询
      • 14、聚合查询

一、Elasticsearch简介

Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为Elastic Stack的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。

The Elastic Stack包括Elasticsearch、Kibana、Beats和Logstash,也称为ELK Stack。

能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。

Elasticsearch简称ES,ES是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack技术栈的核心,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

PB是数据存储容量的单位,它等于2的50次方个字节,或者在数值上大约等于1000TB。

二、下载与安装

1、Elasticsearch官网下载地址

https://www.elastic.co/cn/downloads/elasticsearch
在这里插入图片描述

2、下载成功

在这里插入图片描述

3、双击elasticsearch.bat启动

在这里插入图片描述

4、启动成功

在这里插入图片描述

三、数据格式

Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解,我们将Elasticsearch里存储文档数据和关系型数据库Mysql存储数据的概念进行一个类比:
在这里插入图片描述
ES里的Index可以看做一个库,而Types相当于表,Documents则相当于表的行。

Elasticsearch7.X中,Type的概念已经被删除了。

四、索引

1、创建索引

在postman中,向ES服务器发送PUT请求:127.0.0.1:9200/work
在这里插入图片描述
由于PUT请求具有幂等性,每次PUT请求创建的结果都是一样的,再次请求时,由于ES中已经存在名为work的索引了,所以会创建失败。
在这里插入图片描述
POST是不具有幂等性的,所以POST请求后,结果可能不一样,所以添加索引的时候是不允许使用POST请求的。
在这里插入图片描述

什么是幂等性?
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。

2、查询索引

(1)通过GET请求可以获取单一索引
在这里插入图片描述
(2)获取全部索引信息

127.0.0.1:9200/_cat/indices?v
在这里插入图片描述

3、删除索引

在这里插入图片描述

五、文档

1、创建文档

ES中的文档相当于MySQL中的表数据,数据格式为JSON格式。

由于文档生成时会自动创建一个唯一性标识,因为POST不是幂等性的,PUT是幂等性的,所以这里只能用POST。
在这里插入图片描述
可以指定id
在这里插入图片描述

2、查询文档

(1)根据id查询

在这里插入图片描述
(2)查询所有文档

127.0.0.1:9200/work/_search
在这里插入图片描述
3、更改文档内容
(1)修改文档id=1001的内容,恭喜哪吒大佬被评选为“2021博客之星TOP10”,锣鼓喧天,鞭炮旗鼓。
在这里插入图片描述
(2)局部更新

在这里插入图片描述
(3)局部更新成功,恭喜哪吒成功晋升TOP5。

在这里插入图片描述

六、复杂查询

1、指定条件查询

(1)查询name为哪吒的索引(通过请求路径:127.0.0.1:9200/work/_search?q=name:哪吒)
在这里插入图片描述
注意:满篇全是截图也不好看,以下就不截图了,望谅解。

(2)请求体查询

get请求:127.0.0.1:9200/work/_search

请求体:

{
   "query":{
       "match":{
          "name":"哪吒"
       }
   } 
}

(3)分页查询

get请求:127.0.0.1:9200/work/_search

请求体:

{
   "query":{
       "match_all":{
          
       }
   } ,
   "from":0,
   "size":2
}

(4)只获取指定字段 and 根据id排序

{
   "query":{
       "match_all":{
         
       }
   } ,
   "from":0,
   "size":2,
   "_source":["title"],
   "sort":{
       "_id":"desc"
   }
}

2、多条件查询

must表示and匹配

{
   "query":{
       "bool":{
         "must":[
             {
                 "match":{
                     "name":"哪吒"
                 }
             },{
                 "match":{
                     "title":"博客专家"
                 }
             }
         ]
       }
   } 
}

should表示or匹配

{
   "query":{
       "bool":{
         "should":[
             {
                 "match":{
                     "name":"哪吒"
                 }
             },{
                 "match":{
                     "name":"CSDN"
                 }
             }
         ]
       }
   } 
}

范围匹配:工资大于10000

{
   "query":{
       "bool":{
         "should":[
             {
                 "match":{
                     "name":"哪吒"
                 }
             },{
                 "match":{
                     "name":"CSDN"
                 }
             }
         ],
         "filter":{
             "range":{
                 "money":10000
             }
         }
       }
   } 
}

3、部分词汇匹配查询

将每一个值拆解,组成倒排索引,方便进行全文检索。

{
   "query":{
       "match":{
         "name":"哪"
       }
    }
}

完全匹配

{
   "query":{
       "match_phrase":{
         "name":"哪"
       }
    }
}

高亮显示

{
   "query":{
       "match":{
         "name":"哪"
       }
    },
    "highlight":{
        "fields":{
            "name":{}
        }
    }
}

4、聚合查询

(1)分组查询

{
   "aggs":{
       "money_group":{
         "terms":{
             "field":"money"
         }
       }
    },
    "size":0
}

(2)平均值查询

{
   "aggs":{
       "money_avg":{
         "avg":{
             "field":"money"
         }
       }
    },
    "size":0
}

七、代码实例

1、引入pom


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> 
    </parent>
    <groupId>com.guor</groupId>
    <artifactId>es</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>es</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
 
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.8.0</version>
        </dependency>
        
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.8.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>elasticsearch-rest-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.8.0</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
 
</project>

2、添加索引

package com.guor.es.test;
 
import org.apache.http.HttpHost;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
 
public class ESTest {
    public static void main(String[] args) throws Exception{
        //创建es客户端
        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost",9200,"http"))
        );
 
        //创建索引
        CreateIndexRequest request = new CreateIndexRequest("student");
 
        CreateIndexResponse createIndexResponse = esClient.indices().create(request, RequestOptions.DEFAULT);
 
        boolean acknowledged = createIndexResponse.isAcknowledged();
        System.out.println("创建索引:"+acknowledged);
        // 关闭es客户端
        esClient.close();
    }
}

3、运行出错

在这里插入图片描述
解决方法:

将pom中

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

替换为:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.8.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>7.8.0</version>
</dependency>

4、查询索引

package com.guor.es.test;
 
import org.apache.http.HttpHost;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.client.indices.GetIndexResponse;
 
public class ESTest {
    public static void main(String[] args) throws Exception{
        //创建es客户端
        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost",9200,"http"))
        );
 
        //创建索引
        GetIndexRequest request = new GetIndexRequest("student");
 
        GetIndexResponse getIndexResponse = esClient.indices().get(request, RequestOptions.DEFAULT);
 
        //响应状态
        System.out.println(getIndexResponse.getAliases());
        System.out.println(getIndexResponse.getMappings());
        System.out.println(getIndexResponse.getSettings());
        // 关闭es客户端
        esClient.close();
    }
}

5、插入文档