Elasticsearch解析和基于SpringBoot使用

这篇具有很好参考价值的文章主要介绍了Elasticsearch解析和基于SpringBoot使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

全文搜索概念

全文搜索(检索),工作原理:计算机索引程序,扫描文章中的每一个词,对每一个词建立一个索引,指明出现次数和位置。查询时通过索引进行查找,类似于查字典。
因为是通过索引在查,速度较于通过sql查,会快很多。
具体过程如下:
1、建文本库
2、建立索引
3、执行搜索
4、过滤结果

全文搜索相关技术

Lucene:https://lucene.apache.org/core/
Solr:https://solr.apache.org/
Elasticsearch:https://www.elastic.co/cn/elasticsearch
Lucene是搜索引擎,Elasticsearch和Solr都是基于Lucene之上实现的全文检索系统
Elasticsearch和Solr对比,版本比较老,做参考即可

Lucene内核原理

Elasticsearch解析和基于SpringBoot使用,SpringBoot,spring boot,elasticsearch,后端
Elasticsearch解析和基于SpringBoot使用,SpringBoot,spring boot,elasticsearch,后端
Elasticsearch解析和基于SpringBoot使用,SpringBoot,spring boot,elasticsearch,后端
Elasticsearch解析和基于SpringBoot使用,SpringBoot,spring boot,elasticsearch,后端
Elasticsearch解析和基于SpringBoot使用,SpringBoot,spring boot,elasticsearch,后端

Lucene与Mysql内核比较

Elasticsearch解析和基于SpringBoot使用,SpringBoot,spring boot,elasticsearch,后端

Elasticsearch概述

一个高度可扩展的开源全文搜索和分析引擎,它允许用户快速地、近实时地对大数据进行存储、搜索和分析,它通常用来支撑有复杂的数据搜索需求的企业级应用 。
不支持事务

近实时

近实时,而不是实时
索引文档到可搜索的时间有一个轻微的延迟(通常为1秒)。之所以会有这个延时,主要考虑查询的性能优化。
想要实时,就得刷新,要么是牺牲索引的效率(每次索引之后刷新),要么就是牺牲查询的效率(每次查询之前都进行刷新 ),Elasticsearch取了折中,每隔n秒自动刷新
Elasticsearch 索引新文档后,不会直接写入磁盘,而是首先存入文件系统缓存,之后根据刷新设置,定期同步到磁盘。索引我们改完内容不会立即被搜索出来,但是会在1秒内可见

索引

相似文档的集合

类型

对一个索引中包含的文档进一步细分

文档

索引的基本单位,与索引中的一个类型相对应

分片(Shard)和副本(Replica)

数据量较大时,把索引分成多个分片来存储索引的部分数据,提高性能/吞吐量
为了安全,一个分片中的数据至少有一个副本

Elasticsearch解析和基于SpringBoot使用,SpringBoot,spring boot,elasticsearch,后端

下载

https://www.elastic.co/cn/downloads/elasticsearch
注意版本,spring-boot2.x,不要用最新版本,用7.x.x

启用

命令行进入bin目录,执行elasticsearch启动服务,Ctrl/command + C停止服务
启用localhost:9200,测试Elasticsearch节点是否正在运行,可能会遇到安全认证问题,见问题部分

{
    "name": "zhangxingxingdeMacBook-Pro.local",
    "cluster_name": "elasticsearch",
    "cluster_uuid": "DwgXhzhwQ9WS0drElcEZmg",
    "version": {
        "number": "7.11.1", // 当前elasticsearch版本
        "build_flavor": "default",
        "build_type": "tar",
        "build_hash": "ff17057114c2199c9c1bbecc727003a907c0db7a",
        "build_date": "2021-02-15T13:44:09.394032Z",
        "build_snapshot": false,
        "lucene_version": "8.7.0", //lucene版本
        "minimum_wire_compatibility_version": "6.8.0",
        "minimum_index_compatibility_version": "6.0.0-beta1"
    },
    "tagline": "You Know, for Search"
}

SpringBoot整合

引入依赖

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

创建文档类

@Document(indexName = "blog")
@Table(name = "article")
public class EsBlog implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id // 主键
    private String id;

    private String title;

    private  String author;

    private String content;

    protected EsBlog(){}

    public EsBlog(String title, String author, String content){
        this.title = title;
        this.author = author;
        this.content = content;
    }

   ......

    @Override
    public String toString(){
        return String.format(
                "Article[id=%s, title='%s', author='%s', content='%s']",
                id, title, author, content
        );
    }
}

创建资源库

@Repository
public interface EsBlogRepository extends ElasticsearchRepository<EsBlog, String> {
    Page<EsBlog> findByTitleContainingOrAuthorContainingOrContentContaining(String title, String author, String content, Pageable pageable);
}

注意在创建启动类中进行包扫描,否则注入的时候找不到bean

@EnableJpaRepositories(basePackages = "com.xxx.xxx")

测试文件初始化数据

@RunWith(SpringRunner.class)
@SpringBootTest(classes= SpringApplicationSock.class) // 启动sping-boot,引入IOC
public class EsBlogRepositoryTest {
    @Autowired
    private EsBlogRepository esBlogRepository;

    @Before
    public void initRepositoryData(){
        // 清除所有数据
        esBlogRepository.deleteAll();

        // 初始化数据,存入es存储库
        esBlogRepository.save(new EsBlog("静夜思", "李白", "床前明月光,疑是地上霜。举头望明月,低头思故乡。"));
        esBlogRepository.save(new EsBlog("咏柳", "贺知章", "碧玉妆成一树高,万条垂下绿丝绦。不知细叶谁裁出,二月春风似剪刀。"));
        esBlogRepository.save(new EsBlog("悯农", "李绅", "锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦。"));
    }

    @Test
    public void testFindDistincEsBlogTitleContainingOrSummaryContainingOrContentContaining(){
        // 初始化一个分页请求
        Pageable pageable = PageRequest.of(0, 20);
        String title = "咏";
        String author = "王";
        String content = "月";

        Page<EsBlog> page = esBlogRepository.findByTitleContainingOrAuthorContainingOrContentContaining(title, author, content, pageable);
        System.out.println("=================start");
        for(EsBlog blog : page){
            System.out.println(blog.toString());
        }
        System.out.println("=================end");
    }
}

查看存储库
http://localhost:9200/_cat/indices?v=
Elasticsearch解析和基于SpringBoot使用,SpringBoot,spring boot,elasticsearch,后端

上述内容通过查询条件,只能查出两条数据
Elasticsearch解析和基于SpringBoot使用,SpringBoot,spring boot,elasticsearch,后端
查看blog相关信息
http://localhost:9200/blog

{
    "blog": {
        "aliases": {},
        "mappings": {
            "properties": {
                "_class": {
                    "type": "keyword",
                    "index": false,
                    "doc_values": false
                },
                "author": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "content": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "title": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        },
        "settings": {
            "index": {
                "routing": {
                    "allocation": {
                        "include": {
                            "_tier_preference": "data_content"
                        }
                    }
                },
                "refresh_interval": "1s",
                "number_of_shards": "1",
                "provided_name": "blog",
                "creation_date": "1703233943853",
                "store": {
                    "type": "fs"
                },
                "number_of_replicas": "1",
                "uuid": "0ELJkqnmTg-tDwritULELA",
                "version": {
                    "created": "7110199"
                }
            }
        }
    }
}

创建控制器

@RestController
@RequestMapping("/blogs")
public class EsBlogController {
    @Autowired
    private EsBlogRepository esBlogRepository;

    @GetMapping
    public List<EsBlog> list(
            @RequestParam(value = "title", required = false, defaultValue = "") String title,
            @RequestParam(value = "author", required = false, defaultValue = "") String author,
            @RequestParam(value = "content", required = false, defaultValue = "") String content,
            @RequestParam(value = "pageIndex", required = false, defaultValue = "0") int pageIndex,
            @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize
    ){
        Pageable pageable = PageRequest.of(pageIndex, pageSize);
        Page<EsBlog> page = esBlogRepository.findByTitleContainingOrAuthorContainingOrContentContaining(title, author, content, pageable);
        return page.getContent();
    }
}

Elasticsearch解析和基于SpringBoot使用,SpringBoot,spring boot,elasticsearch,后端

问题

1、ElasticSearch服务正常启动,但是在浏览器上无法访问http://localhost:9200,最新版本可能会有这个问题
received plaintext http traffic on an https channel, closing connection Netty4HttpChannel{localAddress=/[0:0:0:0:0:0:0:1]:9200, remoteAddress=/[0:0:0:0:0:0:0:1]:63470}
解决方法:
ElasticSearch默认开启了安全认证,需要将安全认证关掉
config/elasticsearch.yml,将下面两处的true改为false
Elasticsearch解析和基于SpringBoot使用,SpringBoot,spring boot,elasticsearch,后端
2、启动test,提示Unsatisfied dependency expressed through field ‘esBlogRepository’;
未启动spring boot,没有IOC
https://blog.csdn.net/weixin_43801567/article/details/96643032
3、Unable to parse response body for Response{requestLine=POST /blog/_doc?timeout=1m HTTP/1.1, host=http://localhost:9200, response=HTTP/1.1 201 Created}
es服务器的响应程序解析不了,有可能是spring-boot版本低了
spring-boot 2.7.3,es:8.11.3 会有问题,将es改为7.11.1正常

参考

36 张图详解ElasticSearch 原理+实战知识点
SpringData集成ElasticSearch
Elasticsearch由浅入深(一)简介、、安装、CRUD
Elasticsearch由浅入深(二)ES基础分布式架构、横向扩容、容错机制文章来源地址https://www.toymoban.com/news/detail-826652.html

到了这里,关于Elasticsearch解析和基于SpringBoot使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot中的Elasticsearch自动配置:原理与使用

    在Spring Boot中,Elasticsearch是非常流行的搜索引擎。为了方便开发人员使用Elasticsearch,Spring Boot提供了Elasticsearch自动配置功能。本文将介绍Elasticsearch自动配置的原理与使用。 Elasticsearch自动配置是Spring Boot对Elasticsearch进行封装的一种方式,它主要是通过将Elasticsearch相关的配置

    2024年02月12日
    浏览(51)
  • Spring Boot 中使用 Elasticsearch 实现商品搜索功能

    作者:禅与计算机程序设计艺术 Elasticsearch 是开源分布式搜索引擎,它提供了一个分布式、RESTful 搜索接口。基于 Elasticsearch 的搜索方案能够轻松应对复杂的检索场景并提供高扩展性。在 Web 应用中,Elasticsearch 可以作为后台服务支持用户的检索需求。本文将会教你如何使用

    2024年02月06日
    浏览(42)
  • spring boot使用elasticsearch分词,排序,分页,高亮简单示例

    记,写一个简单的es分词demo,es版本6.8.12 如果使用es7有些方法可能会有所改变,请参考7的文档 es安装教程:http://t.csdn.cn/BSh12 怎么简单怎么来 商品名称加了 @Field(type = FieldType.Text, analyzer = “ik_max_word”) 会自动分词 分页处理 3.2.1 分词 当输入衣服鞋子的时候会将分

    2024年02月08日
    浏览(38)
  • Spring Boot中Elasticsearch的连接配置、原理与使用

    Elasticsearch是一种开源的分布式搜索和数据分析引擎,它可用于全文搜索、结构化搜索、分析等应用场景。在Spring Boot中,我们可以通过Elasticsearch实现对数据的搜索和分析。本文将介绍Spring Boot中Elasticsearch的连接配置、原理和使用方法。 在Spring Boot中,我们可以通过引入Elast

    2024年02月11日
    浏览(36)
  • 使用Spring Boot集成中间件:Elasticsearch基础->提高篇

    Elasticsearch是一个开源的分布式搜索和分析引擎,广泛用于构建实时的搜索和分析应用。在本篇博客中,我们将深入讲解如何使用Spring Boot集成Elasticsearch,实现数据的索引、搜索和分析。 在开始之前,确保已经完成以下准备工作: 安装并启动Elasticsearch集群 创建Elasticsearch索引

    2024年01月19日
    浏览(41)
  • 如何使用Spring Cloud搭建高可用的Elasticsearch集群?详解Elasticsearch的安装与配置及Spring Boot集成的实现

    Spring Cloud 是一个基于 Spring Boot 的微服务框架,它提供了一系列组件和工具,方便开发人员快速搭建和管理分布式系统。Elasticsearch 是一个开源的全文搜索引擎,也是一个分布式、高可用的 NoSQL 数据库。本篇博客将详细讲解如何使用 Spring Cloud 搭建 Elasticsearch,并介绍如何在

    2023年04月09日
    浏览(48)
  • 使用Spring Boot、MyBatis Plus和Elasticsearch的简单示例

    下面是一个使用Spring Boot、MyBatis Plus和Elasticsearch的简单示例: 首先,在pom.xml文件中添加以下依赖: 创建一个Spring Boot应用程序: 在application.properties文件中配置Elasticsearch: spring.data.elasticsearch.cluster-name:设置Elasticsearch集群的名称。 spring.data.elasticsearch.cluster-nodes:设置Elast

    2024年02月11日
    浏览(38)
  • 【Elasticsearch】spring-boot-starter-data-elasticsearch的使用以及Elasticsearch集群的连接

    更多有关博主写的往期Elasticsearch文章 标题 地址 【ElasticSearch 集群】Linux安装ElasticSearch集群(图文解说详细版) https://masiyi.blog.csdn.net/article/details/131109454 基于SpringBoot+ElasticSearch 的Java底层框架的实现 https://masiyi.blog.csdn.net/article/details/121534307 ElasticSearch对标Mysql,谁能拔得头筹

    2024年02月11日
    浏览(36)
  • 基于spring-boot-starter-data-elasticsearch整合elasticsearch于window系统

    在配置环境中会需要到elasticsearch和kibana,这两个和spring-boot-starter-data-elasticsearch都必须得保持版本一致,我们可以通过查看他maven的配置: 比如我使用的是 spring-boot-starter-data-elasticsearch:2.7.3 查看到他的maven的结构后可以看到他们都指向了elasticsearch的一个版本7.17.4,因此在电

    2024年04月25日
    浏览(43)
  • 使用Spring Boot、MyBatis Plus和Elasticsearch配置的简单示例

    下面是一个使用Spring Boot、MyBatis Plus和Elasticsearch的简单示例: 首先,在pom.xml文件中添加以下依赖: 创建一个Spring Boot应用程序: 在application.properties文件中配置Elasticsearch: spring.data.elasticsearch.cluster-name:设置Elasticsearch集群的名称。 spring.data.elasticsearch.cluster-nodes:设置Elast

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包