Elasticsearch基础,SpringBoot整合Elasticsearch

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

ES概述

Elasticsearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
据国际权威的数据库产品评测机构DB Engines的统计,在2016年1月,ElasticSearch已超过Solr等,成为排名第一的搜索引擎类应用。

ES简介

Elasticsearch简介
Elasticsearch是一个实时分布式搜索和分析引擎。它让你以前所未有的速度处理大数据成为可能。它用于全文搜索、结构化搜索、分析以及将这三者混合使用∶
维基百科使用Elasticsearch提供全文搜索并高亮关键字,以及输入实时搜索(search-asyou-type)和搜索纠错(did-you-mean)等搜索建议功能。
英国卫报使用Elasticsearch结合用户日志和社交网络数据提供给他们的编辑以实时的反馈,以便及时了解公众对新发表的文章的回

StackOverflow结合全文搜索与地理位置查询,以及more-like-this功能来找到相关的问题和答案。 Github使用Elasticsearch检索1300亿行的代码。
但是Elasticsearch不仅用于大型企业,它还让像DataDog以及Klout这样的创业公司将最初的想法变成可扩展的解决方案。 Elasticsearch可以在你的笔记本上运行,也可以在数以百计的服务器上处理PB级别的数据。
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

LUCENE简介

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引擎,部分文本分析引擎(英文与德文两种西方语言)。 Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言 , Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。
Lucene是一个全文检索引擎的架构。那什么是全文搜索引擎 ?
全文搜索引擎是名副其实的搜索引擎,国外具代表性的有Google、Fast/AlITheWeb、AltaVista、Inktomi、Teoma、WiseNut等,国内著名的有百度(Baidu)。它们都是通过从互联网上提取的各个网站的信息(以网页文字为主)而建立的数据库中,检索与用户查询条件匹配的相关记录,然后按一定的排列顺序将结果返回给用户,因此他们是真正的搜索引擎。
从搜索结果来源的角度,全文搜索引擎又可细分为两种,一种是拥有自己的检索程序(Indexer),俗称"蜘蛛"(Spider)程序或"机器人"(Robot)程序,并自建网页数据库,搜索结果直接从自身的数据库中调用,如上面提到的7家引擎;另一种则是租用其他引擎的数据库,并按自定的格式排列搜索结果,如Lycos引擎。

ES 和 solr比较

1、es基本是开箱即用(解压就可以用!), 非常简单。Solr安装略微复杂一丢丢 ! 2、Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能。 3、Solr 支持更多格式的数据,比如SON、XML、CSV,而 Elasticsearch 仅支持json文件格式。
4、Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要 kibana友好支撑~!
5、Solr 查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用 ;●ES建立索引快(即查询慢),即实时性查询快,用于facebook新浪等搜索。
● Solr是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
6、Solr比较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而 Elasticsearch相对开发维护者较少,更新太快,学习使用成本较高。

ES安装教程

https://blog.csdn.net/qq_40942490/article/details/111594267

IK中文分词器

安装IK分词器之后,可以配置属于自己的字典,具体目录在config 中的xml文件中配置
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

ES数据结构与mysql的相同之处

Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

使用RESTful风格接口操作ES

Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

使用put命令创建索引(相当于数据库)以及数据,其中test1为索引,type为类型,1为行
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

ES搜索中的数据类型

核心数据类型
String, byte, short,integer,long,float,double,boolean,date
复合数据类型
Array,Object

使用put命令设计索引的数据类型

Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

如果没有设置数据类型,就会在set值的时候自动设置数据类型
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

获取有多少索引

Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

put命令

使用put命令可以直接覆盖数据,其中数据完全被覆盖,以新PUT进去的数据为主
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
其对应的版本号也是会更改的
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

更新命令

使用更新的命令,会根据字段名更新对应的值
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

删除命令

Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

查询

准备数据
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
执行搜索命令
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
执行完搜索之后就发现通过 ‘小米’和‘mix4’都是可以进行查询的 ,然后通过分词器看看“小米mix4”,发现这个字符串被分词为 ‘小米’和‘mix4’,其中英文不分词
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
因为英文不分词 通过中文加部分英文(或者部分数字)的方式是不能查询出来的,而且通过分词器是可以开到分词成功的了。(说明,部分英文具体指分词之后的单词的一部分,例如 小米mix4 会被分为 ‘小米’+‘mix4’,其中‘m’就是mix4的部分英文)
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
条件查询指定字段 其中match是会使用分词器进行解析的
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
根据字段排序
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
分页 使用from和size
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

布尔值查询

其中 must 相当于mysql中的and;
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
should相当于mysql中的or;
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
must_not是不等于的意思(例如下面查询的是name不是小米和desc中没有买的)
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

Filter过滤器

查询名称中有小米的产品,且价格范围在100到2000的
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
多条件查询,多个条件使用空格或者逗号隔开,只要满足一个就可以被查询出来,这个时候可以通过分值进行计算,比如找房子,可以根据多个地区查找
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

倒排索引!

关于分词器

搜索关键字
Match:是会经过分词器解析的
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
Term: 是精确查询,不经过分词器解析
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
数据字段类型不同
当字段类型是text时,是会经过分词器解析的
当字段类型是keyword时,不会经过分词器解析
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
例如我们在设计索引时,设置name是关键字,desc是text,则在我们搜索时会出现以下情况
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
高亮查询
使用highlight关键字,然后指定字段,默认样式是标签
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据
自定义标签,要使用pre_tags和post_tags
Elasticsearch基础,SpringBoot整合Elasticsearch,elasticsearch,spring boot,大数据

引入依赖

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

创建配置文件

package com.mu.es.config;

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("127.0.0.1", 9200, "http")
                ));
        return client;
    }

}

测试类文章来源地址https://www.toymoban.com/news/detail-804861.html


@SpringBootTest
class ElasticsearchApplicationTests {


    // 注入ES客户端
    @Autowired
    RestHighLevelClient restHighLevelClient;

    @Test
    void testCreateIndex() throws IOException {
        // 创建索引
        CreateIndexResponse text_index = restHighLevelClient.indices().create(new CreateIndexRequest("text_index"), RequestOptions.DEFAULT);
        System.out.println("text_index = " + text_index);


    }

    @Test
    void test1() throws IOException {
        // 判断索引是否存在
        GetIndexRequest textIndexGet = new GetIndexRequest("text_index"); // 创建获得索引的请求
        boolean exists = restHighLevelClient.indices().exists(textIndexGet, RequestOptions.DEFAULT);
        System.out.println("exists = " + exists);
    }


    /**
     * 删除索引
     *
     * @throws IOException
     */
    @Test
    void test2() throws IOException {
        DeleteIndexRequest de = new DeleteIndexRequest("text_index");// 创建删除索引的请求
        AcknowledgedResponse response = restHighLevelClient.indices().delete(de, RequestOptions.DEFAULT);
        System.out.println("exists = " + response);
    }

    /**
     * 在索引中添加文档数据
     *
     * @throws IOException
     */
    @Test
    void test3() throws IOException {
        // 准备数据
        User user = new User("mls", 25, "河南");
        // 拿到索引的请求
        IndexRequest request = new IndexRequest("text_index");
        // 设置id
        request.id("1");
        // 设置请求的超时时间
        request.timeout("1s");
        // 将数据放入request请求
        request.source(JSON.toJSONString(user), XContentType.JSON);
        // 将请求发送到ES
        IndexResponse index = restHighLevelClient.index(request, RequestOptions.DEFAULT);
        System.out.println("index = " + index.toString());
        System.out.println("index.status() = " + index.status());


    }


    /**
     * 判断文档是否存在
     *
     * @throws IOException
     */
    @Test
    void test4() throws IOException {
        // 准备请求
        GetRequest request = new GetRequest("text_index", "1");
        Boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
        System.out.println("exists = " + exists);
    }


    /**
     * 获取文档信息
     *
     * @throws IOException
     */
    @Test
    void test5() throws IOException {
        // 准备请求
        GetRequest request = new GetRequest("text_index", "1");
        // 获取文档内容
        GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
        // 获取文档中具体存储的内容
        System.out.println(response.getSourceAsString());
        System.out.println(response);
    }


    /**
     * 更新文档信息
     *
     * @throws IOException
     */
    @Test
    void test15() throws IOException {
        // 准备数据
        User user = new User();
        user.setUsername("穆利帅");
        // 准备请求
        UpdateRequest request = new UpdateRequest("text_index", "1");
        // 设置请求超时时间
        request.timeout("2s");
        // 将数据放在doc中
        request.doc(JSON.toJSONString(user), XContentType.JSON);
        // 发送请求
        UpdateResponse update = restHighLevelClient.update(request, RequestOptions.DEFAULT);
        System.out.println("update.status() = " + update.status());
    }


    /**
     * 删除信息
     *
     * @throws IOException
     */
    @Test
    void test25() throws IOException {
        // 准备请求
        DeleteRequest request = new DeleteRequest("text_index", "1");
        // 设置请求超时时间
        request.timeout("2s");
        // 发送请求
        DeleteResponse delete = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
        System.out.println("update.status() = " + delete.status());
    }

    /**
     * 批量插入
     */
    @Test
    void test11() throws Exception {
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("10s");
        List<User> users = new ArrayList<>();
        users.add(new User("穆利帅0", 24, "beijing"));
        users.add(new User("穆利帅1", 25, "beijing"));
        users.add(new User("穆利帅2", 26, "beijing"));
        users.add(new User("穆利帅3", 27, "beijing"));
        users.add(new User("穆利帅4", 28, "beijing"));
        users.add(new User("穆利帅5", 29, "beijing"));
        for (int i = 0; i < users.size(); i++) {
            // 同样批量更新和批量删除也是一样的
            IndexRequest request = new IndexRequest("text_index");
            request.id(String.valueOf(i))
                    .source(JSON.toJSONString(users.get(i)), XContentType.JSON);
            bulkRequest.add(request);
        }
        BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println("bulk.status() = " + bulk.status());


    }


    /**
     *  查询
     *
     * @throws Exception
     */
    @Test
    void test111() throws Exception {
      // 准备请求
        SearchRequest searchRequest = new SearchRequest("text_index");


        // 准备查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        //  builder.query(QueryBuilders.termQuery("username","穆利帅1")); // 精确查询 分词器不分词
        builder.query(QueryBuilders.matchQuery("username","穆利帅")); // 分词查询 分词器分词
        // 起始
        builder.from(0);
        // 每页数目
        builder.size(10);
        // 排序
        builder.sort("age", SortOrder.DESC);
        // 设置查询条件的过期时间
        builder.timeout(new TimeValue( 60, TimeUnit.SECONDS));



        // 设置请求条件
        searchRequest.source(builder);
        // 发出查询请求
        SearchResponse res = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        SearchHit[] hits = res.getHits().getHits();
        for (SearchHit hit : hits) {
            System.out.println("hit.getSourceAsString() = " + hit.getSourceAsString());
        }
    }

}

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

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

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

相关文章

  • Elasticsearch安装、使用,Springboot整合Elasticsearch详细教程

    Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够实现近乎实时的搜索。 Elasticsearch官网 https://www.elastic.co/cn/ 这篇文章主要简单介绍一下Elasticsearch,Elasticsearch的java API博主也在学习中,文章会持续更新~ 目录 第一步:下载Elasticsearch 下载7.6.2版本 下载其他版本

    2024年02月04日
    浏览(34)
  • Elasticsearch 整合springboot-Elasticsearch文章二

    https://www.elastic.co/cn/ https://docs.spring.io/spring-data/elasticsearch/docs/4.4.10/reference/html/ 我们选用的是elasticsearch 7.17.9版本,对应的,我们需要升级springboot版本,对应的中间件都需要升级 Springboot: 2.7.10 spring-data-elasticsearch: 4.4.10 spring-boot-starter-data-elasticsearch: 2.7.10 https://github.com/OrderDo

    2024年02月15日
    浏览(45)
  • 三.SpringBoot整合Elasticsearch

    我们整合es直接给es发请求就可以了,但是现在有很多方式去调用es的接口,那都有那些呢? 访问es端口 访问方式 使用工具 缺点 9300 TCP transport-api.jar 不适配es版本,es 8.0之后弃用。 9200 HTTP JestClient 非官方,对应es版本更新慢。 9200 HTTP RestTemplate 模拟发送http请求,但是很多请求

    2024年02月13日
    浏览(35)
  • ElasticSearch(九)【SpringBoot整合】

    上一篇文章 《ElasticSearch - 过滤查询》 9.1 基本环境配置 创建一个springboot工程 springboot-elasticsearch 在 pom.xml 导入依赖 【 注意 】使用的springboot需要根当前ES版本兼容 配置 application.yml 文件 配置客户端 创建config包,添加配置类 RestClientConfiguration.class 配置完之后,该配置类不仅

    2024年02月14日
    浏览(33)
  • SpringBoot 整合 ElasticSearch

    😍开始前给大家推荐一款很火的刷题、面试求职网站💕 https://www.nowcoder.com/link/pc_csdncpt_xiaoying_java 索引Index 一组相似文档的集合 一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个商品数据的索引,一个订单数据的索引,还有一个用户数据的索引。一

    2023年04月08日
    浏览(32)
  • ElasticSearch系列 - SpringBoot整合ES:ElasticSearch分析器

    1. ElasticSearch match 文本搜索的过程? Elasticsearch 的 match 查询是一种基于文本匹配的查询方式,它的搜索过程如下: ① 将查询字符串分词:Elasticsearch 会将查询字符串分成一个个词项(term),并去除停用词(如“的”、“是”等常用词汇)和标点符号等无意义的字符。 ② 构建

    2023年04月18日
    浏览(120)
  • springboot 整合 ElasticSearch 方法 (二)

    在pom.xml文件中需要引入3个依赖, 三个都必须有并且三个依赖的版本要一致 , 不然会报错. 不一定是 7.6.1 这个版本 , 只需要保证这三个依赖的版本一致就可以了. 用配置类的方法来配置 es, 配置文件中就 只需要写一下用户名和密码之类的就可以了, 我们用 @Value 拿到它 . 设置用户

    2024年01月24日
    浏览(80)
  • springboot整合elasticsearch8

    1.引入maven依赖 2.application.yml添加配置 3.编写config文件 启动demo项目,通过控制台日志查看是否能够正常连接es。 4.在DemoApplicationTests编写简单测试操作es。

    2024年02月12日
    浏览(45)
  • SpringBoot整合ElasticSearch版本问题

    最近在整个这两个框架,发现老是版本对不上,不是缺少类,就是启动不了,美好的一下午就这样浪费了,多说一句废话,es的版本更新速度也太快了,如果spring boot已经固定的,注意一下es的版本。 下面的这个链接是spring官方提供的兼容版本 springboot与elasticsearch兼容版本对应

    2024年02月15日
    浏览(40)
  • springboot整合elasticsearch使用案例

    完成搜索和分页 添加品牌、城市、星级、价格等过滤功能 搜索我附近的酒店    让指定的酒店在搜索结果中排名置顶 添加isAD字段

    2024年02月09日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包