当前位置:首页 » 《随便一记》 » 正文

【Spring Boot 30】Spring Boot整合全文搜索引擎Elasticsearch_Java攻城狮

20 人参与  2022年03月30日 11:09  分类 : 《随便一记》  评论

点击全文阅读


🍅 Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强)
🍅 基础推荐:Java基础教程系列
🍅 实战推荐:Spring Boot基础教程
🍅 简介:Java领域优质创作者🏆、CSDN哪吒公众号作者✌ 、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搜索引擎构建入门与实战
      • 1、内容简介
      • 2、京东

一、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

<?xml version="1.0" encoding="UTF-8"?>
<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/> <!-- lookup parent from repository -->
    </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>
        <!-- elasticsearch的客户端 -->
        <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>
        <!-- elasticsearch依赖2.x的log4j -->
        <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>
        <!-- junit单元测试 -->
        <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、插入文档

package com.guor.es.test;
 
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.client.indices.GetIndexResponse;
import org.elasticsearch.common.xcontent.XContentType;
 
public class ESTestDoc {
    public static void main(String[] args) throws Exception{
        addDoc();
    }
 
 
    private static void addDoc() throws Exception{
        //创建es客户端
        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost",9200,"http"))
        );
 
        IndexRequest request = new IndexRequest();
        request.index("work").id("1001");
 
        Work work = new Work();
        work.setName("哪吒");
        work.setAge(28);
        work.setSex(0);
 
        ObjectMapper mapper = new ObjectMapper();
        String workJson = mapper.writeValueAsString(work);
        IndexRequest response = request.source(workJson, XContentType.JSON);
        System.out.println(response.getShouldStoreResult());
        esClient.index(request, RequestOptions.DEFAULT);
 
        // 关闭es客户端
        esClient.close();
    }
}

在这里插入图片描述

6、批量插入文档

private static void addBatchDoc() throws Exception{
    //创建es客户端
    RestHighLevelClient esClient = new RestHighLevelClient(
            RestClient.builder(new HttpHost("localhost",9200,"http"))
    );
 
    BulkRequest request = new BulkRequest();
    request.add(new IndexRequest().index("work").id("1001").source(XContentType.JSON, "name", "csdn哪吒"));
    request.add(new IndexRequest().index("work").id("1002").source(XContentType.JSON, "name", "csdn哪吒1"));
    request.add(new IndexRequest().index("work").id("1003").source(XContentType.JSON, "name", "csdn哪吒2"));
    BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
    System.out.println(response.getTook());
    System.out.println(response.getItems());
    // 关闭es客户端
    esClient.close();
}

7、根据条件查询文档中全部数据

/**
 * 查询索引中全部数据
 */
private static void getDoc() throws Exception{
    //创建es客户端
    RestHighLevelClient esClient = new RestHighLevelClient(
            RestClient.builder(new HttpHost("localhost",9200,"http"))
    );
 
    //查询索引中全部数据
    SearchRequest request = new SearchRequest();
    request.indices("work");
 
    //构造查询条件,匹配所有
    SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
    request.source(query);
 
    //查询文档
    SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    //查询的结果
    SearchHits hits = response.getHits();
    //查询条数
    System.out.println(hits.getTotalHits());
    //查询时间
    System.out.println(response.getTook());
    //查询的具体数据
    for (SearchHit hit : hits){
        System.out.println(hit.getSourceAsString());
    }
    // 关闭es客户端
    esClient.close();
}

控制台输出
在这里插入图片描述

8、按条件查询

SearchSourceBuilder query = new SearchSourceBuilder().
query(QueryBuilders.termQuery("name","csdn哪吒"));

9、分页查询

//构造查询条件,分页查询
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
//起始页
builder.from(0);
//每页数据量
builder.size(2);
request.source(builder);

10、按年龄排序

//按照年龄排序
SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
builder.sort("age", SortOrder.DESC);
request.source(builder);

控制台输出
在这里插入图片描述

11、按条件查询

在这里插入图片描述

12、组合条件查询

在这里插入图片描述

13、模糊查询

//差一个字符也能匹配
SearchSourceBuilder builder = new SearchSourceBuilder();
FuzzyQueryBuilder fuzziness = QueryBuilders.
fuzzyQuery("name", "哪吒").fuzziness(Fuzziness.ONE);
 
builder.query(fuzziness);
request.source(builder);

14、聚合查询

在这里插入图片描述

八、Elasticsearch搜索引擎构建入门与实战

1、内容简介

从 Elasticsearch 的基本概念和原理讲起,然后系统介绍 Elasticsearch 的使用场景,带领读者近距离接触 Elasticsearch。

本书全面涵盖Elasticsearch客户端的安装和使用、索引创建、文档操作、搜索匹配、搜索排序和聚合等技术,可以帮助读者循序渐进地掌握 Elasticsearch的相关知识。

共8章,分为3篇。

第1篇 “Elasticsearch 基础”,主要介绍 Elasticsearch 的基础知识和基本用法;

第2篇 “Elasticsearch 提高” ,首先介绍文本搜索和排序原理,然后介绍聚合的使用方法;

第3篇 “Elasticsearch 实战”,以酒店搜索为案例,详细介绍 Elasticsearch 在实际搜索应用中涉及的相关技术,帮助读者全面了解搜索引擎,从而提高开发水平。

2、京东

Elasticsearch搜索引擎构建入门与实战

Elasticsearch搜索引擎构建入门与实战



上一篇:【Spring Boot 29】Spring Boot整合流控组件Sentinel

下一篇:SpringBoot学习路线总结,跟着路线走,不迷路(附思维导图)


在这里插入图片描述

添加微信,备注1024,赠送Java学习路线思维导图

点击全文阅读


本文链接:http://zhangshiyu.com/post/37011.html

哪吒  查询  索引  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1