Elasticsearch(二)Text和Keyword类型的区别、Springboot整合ES

es7.x Es常用核心知识快捷版1(分词textkeyword 保存一个字符串字段时,es自动生成的该字段的mapping是text + keyword(缺点:分词的颗粒度大,可能跳过一些重要分词,导致查询结果不全面,查全率低。缺点:因为分词太过详细,导致有一些无用分词,占用空间较大,查询速度慢。优点:特征是粗略快速的将文字进行分词,占用空间小,查询速度快。详细的文字片段进行分词,查询时查全率高,不容易遗漏数据。1.创建或者更新文档时,会对文档进行分词,可以指定分词。明确字段是否需要分词,不需要分词的字段。2.搜索:查询时,对查询语句分词。"中华人民共国人民大会堂" 阅读详情

1.Text和Keyword类型的区别

text: 它会为该字段的内容进行拆词操作,并放入倒排索引表中

keyword: 它不会进行拆词操作

使用match匹配查询---对匹配的关键字进行拆词操作,并和倒排索引表中对应。

使用term精准匹配---它不会对关键字进行拆词操作,而且把关键字作为一个整体和倒排索引表进行匹配

2.Springboot整合ES

1.创建一个Springboot工程并加入相关的依赖

<dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2.创建一个配置,获取ES工具类对象。

@Configuration
public class ESConfig {

    //该对象可以对ES进行相关的操作
    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("127.0.0.1",9200,"http")));
        return client;
    }
}

3.进行相关对ES操作

3.1 操作索引(indices)---创建索引

@Test
    void testCreateIndex() throws Exception{
        CreateIndexRequest createIndexRequest = new CreateIndexRequest("testindex_02");
        CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
        System.out.println(createIndexResponse.isAcknowledged());
    }

3.2 操作索引--删除索引

    //删除索引
    @Test
    void testDeleteIndex() throws Exception{
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("testindex_02");
        AcknowledgedResponse delete = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
        System.out.println(delete.isAcknowledged());
    }

3.3 索引操作--判断索引是否存在

    //查询索引
    @Test
    void testExistIndex() throws Exception{
        GetIndexRequest getIndexRequest = new GetIndexRequest("testindex_02");
        boolean b = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
        System.out.println(b);
    }

3.4.对文档的操作(index)---添加文档

    //添加文档
    @Test
    void testInsetDoc() throws Exception{
        IndexRequest indexRequest = new IndexRequest("testindex_02");
        //指定文档的内容:String文档的json内容,XContentType xContentType:以什么格式
        indexRequest.source(JSON.toJSONString(new User("1", "张三", "北京", 17)),XContentType.JSON);
        IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println(indexResponse.getResult());
    }

3.5.查询文档

    //查询文档
    @Test
    void testGetDoc() throws Exception{
        GetRequest getRequest = new GetRequest("testindex_02");
        getRequest.id("Fk38pYIB_tpG9hpoQyI3");
        GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);

        System.out.println(getResponse.getSourceAsMap());
    }

3.6.判断文档是否存在

    //判断文档是否存在
    @Test
    void testExistDoc() throws Exception{
        GetRequest getRequest = new GetRequest("testindex_02");
        getRequest.id("Fk38pYIB_tpG9hpoQyI3");
        boolean b = client.exists(getRequest, RequestOptions.DEFAULT);
        System.out.println(b);
    }

3.7.修改文档

    //修改文档
    @Test
    void testUpdateDoc() throws Exception{
        UpdateRequest updateRequest = new UpdateRequest("testindex_02","Fk38pYIB_tpG9hpoQyI3");
        User user = new User();
        user.setName("阿大");
        updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
        UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println(updateResponse.getResult());
    }

3.8.删除文档

    //删除文档
    @Test
    void testDeleteDoc() throws Exception{
        DeleteRequest deleteRequest = new DeleteRequest("testindex_02");
        deleteRequest.id("Fk38pYIB_tpG9hpoQyI3");
        DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println(deleteResponse.getResult());
    }

3.9.批量添加文档

    //批量添加文档
    @Test
    void testBulkDoc() throws Exception {
        BulkRequest bulkRequest = new BulkRequest("testindex_02");
        List<User> list = new ArrayList<>();
        list.add(new User("1","张三","北京",12));
        list.add(new User("2","李四","上海",14));
        list.add(new User("3","王五","武汉",17));
        /*list.stream().forEach(item->
        bulkRequest.add(new IndexRequest().id(item.getId()).source(JSON.toJSONString(item),XContentType.JSON)));*/
        for(User user : list){
            IndexRequest indexRequest = new IndexRequest();
            indexRequest.id(user.getId());
            indexRequest.source(JSON.toJSONString(user),XContentType.JSON);
            bulkRequest.add(indexRequest);
        }
        BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulkResponse.hasFailures());
    }

3.10.复杂查询

    /*搜索查询---GET /索引/_search
     {
         "query":{
             "":{}
          },
      "from":
        "size":
         "_source":["",""],
         "sort":{}
     }
    1. 搜索请求对象SearchRequest
    2. 构建一个条件对象SearchSourceBuilder
    3. 把条件对象放入搜索请求对象中
    4. 执行搜索功能*/
    @Test
    void testSearch() throws Exception{
        SearchRequest searchRequest = new SearchRequest("testindex_02");
        //创建一个条件对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "张");
        searchSourceBuilder.query(termQueryBuilder);

        //分页
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(1);

        //排序
        searchSourceBuilder.sort("age");

        //高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("name");
        //首
        highlightBuilder.preTags("<font color='red'>");
        //尾
        highlightBuilder.postTags("</font>");
        searchSourceBuilder.highlighter(highlightBuilder);

        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        System.out.println("总条数:"+searchResponse.getHits().getTotalHits().value);
        SearchHit[] searchHits = searchResponse.getHits().getHits();

        Arrays.stream(searchHits).forEach(item-> System.out.println(item.getSourceAsString()));

        Arrays.stream(searchHits).forEach(item-> System.out.println(item.getHighlightFields()));
    }
Estextkeyword类型以及如何修改类型 昨天同事触发定时任务发现es相关服务报了一个序列化问题,今天早上捕获异常将异常堆栈全部打出来看,才发现是聚合的字段不是keyword类型的问题。到kibbna命令行执行也是一样的错误使用 /_mapping查看索引的字段类型,才发现userUniqueid是text类型如果用text执行聚合,还必须在字段名后面加上 userUniqueid.keyword才能聚合。需要重新建索引,指定类型!这里说说textkeyword区别 阅读详情

相关推荐

springboot整合ES 综合案例--京东搜索

1.1创建一个Springboot工程并加入相关的依赖。1.2 创建一个配置,获取ES工具类对象。2.3 索引操作--判断索引是否存在。2.1 操作索引---创建索引。2.4 操作文档---添加文档。2.6 判断索引文档是否存在。2.2操作索引--删除索引。2.5 查询文档--id。2.9 批量添加文档。...

qq_55682798的博客 837

ES整合SpringBoot并实现京东搜索

IK分词器是ES的一个插件,主要用于把一段中文或者英文的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词器是将每个字看成一个词,比如"我爱技术"会被分为"我","爱","技","术",这显然不符合要求,所以我们需要安装中文分词器IK来解决这个问题;此处图例只是为了举例,更方便理解代码。ik_smart为最少切分,添加了歧义识别功能,推荐;"text":"你爱学习,天天向上","text":"你爱学习,天天向上",....

qq_50896786的博客 2463

Elasticsearch 应用

Elasticsearch 的应用

是个吃不饱的人 529

一文读懂ElasticSearch中字符串keywordtext类型区别

也就是查询条件(广东深圳)会被分词为“广” ,“东”,“深”,“圳”原始数据“广东深圳”去查询,前面说了,字符串默认是既有text类型,又有keyword类型,没有加keyword,查询的就是text类型的,所以命中了两条数据。但是加了keywordES只会去检索keyword类型里存储的数据,不加keywordES只会去检索text类型里存储的数据。不出意料,一条也没有命中,原因是term不会分词,不加keywordES只会去检索text类型里面的数据,自然匹配不到。

weixin_43412919的博客 8104

SpringBoot 整合 ElasticSearch

springBoot整合ES的基本操作

学习学习学习 5434

Spring Boot 3 整合 Elasticsearch 8

Spring Boot 3整合Elasticsearch 8实践指南 本文详细介绍了如何在Spring Boot 3项目中整合Elasticsearch 8,实现全文检索功能。主要内容包括: 技术选型:推荐使用Spring Data Elasticsearch提供的ElasticsearchRepositoryElasticsearchOperations 环境搭建:通过Docker快速启动单节点Elasticsearch服务 项目配置: 添加必要的Maven依赖 配置application.yml连接参

wang20000102的博客 353

SpringBoot3.x整合ElasticSearch8.x

本文介绍了SpringBoot3.x与ElasticSearch8.x的整合方法,重点讲解了Docker部署方案。内容包含:1)使用docker-compose编排ElasticSearchKibana服务;2)容器配置详解,包括内存限制、网络设置跨域配置;3)索引管理操作,如创建、查询、更新删除索引;4)文档CRUD操作示例;5)Mapping动态映射原理常见字段类型说明,特别强调TextKeyword类型区别。全文提供了完整的配置文件操作命令,适合开发者快速搭建ElasticSearch8

jh88h的博客 995

ElasticSearch详解()

ES详解

Tong的博客 714

Elasticsearch

概念:用户输入想要的关键词,返回含有该关键词的所有信息。场景:1互联网搜索:谷歌、百度、各种新闻首页2站内搜索(垂直搜索):企业OA查询订单、人员、部门,电商网站内部搜索商品(淘宝、京东)场景。......

hhxxttxs12332178的博客 616

SpringBoot整合Elasticsearch:从零构建高性能搜索服务的实践指南

在当今数据驱动的时代,高效处理海量数据的搜索与分析是后端开发的核心挑战之一。传统数据库的模糊查询在面对大数据量时性能急剧下降,而分布式搜索引擎技术应运而生,它基于倒排索引原理,提供了近实时的检索能力,成为构建高性能搜索服务的基石。Elasticsearch作为其中的佼佼者,以其易用的RESTful API强大的分布式特性,在日志分析、商品检索等场景中展现出巨大技术价值。SpringBoot框架极大地简化了Java应用的配置与部署,两者结合能快速构建可扩展的搜索服务。本文聚焦于SpringBoot与Elas

weixin_30530339的博客 370

ElasticSearch 快速上手攻略(零基础落地版)

掌握基础概念:索引、文档、映射、分词、倒排索引原理熟练使用 Kibana 完成 CRUD、条件检索、高亮、排序分页安装 IK 分词器,掌握中文检索配置整合 SpringBoot 实现代码级检索、新增、修改学习聚合查询、批量操作、分页优化、集群基础配置(注:部分内容可能由 AI 生成)

2301_78638502的博客 214

ES-基本使用

1.下载 官网:https://www.elastic.co/cn/start 推荐Kibana可视化工具 kibana启动之后,访问链接测试 http://localhost:5601/ 2.简介 索引(index):索引是映射类型的容器,它是一个非常大的文档集合,索引存储了映射类型的字段 其他设置。 类型(type):类型是文档的逻辑容器,就像关系型数据库一样 文档(document):一个文档同时包含字段对应的值,也...

IFuZzz的博客 875

ElasticSearch】Linux搭建ELK,Springboot整合ELK分布式日志

在浏览器打开9200端口地址: (http://120.78.129.95:9200/ (opens new window)),如果出现了下面的信息,就表示已经成功启动了。在浏览器打开5601端口地址: (http://120.78.129.95:5601/ (opens new window)),如果出现了下面的信息,就表示已经成功启动了。下载canal.deployer,可以直接监听MySQL的binlog,把自己伪装成MySQL的从库,只负责接收数据,并不做处理。

weixin_44823875的博客 120

springBoot集成 elasticsearch 并附上一些理解与操作

springBoot集成 elasticsearch 并附上一些理解与操作 **在pom文件中引入elasticsearch org.springframework.boot spring-boot-starter-data-elasticsearch ** ![在这里插入图片描述](https://img-blog.csdnimg.cn/201...

weixin_43564627的博客 2808

微服务全套

对于单表查询很好用自定义接口继承IService接口自定义实现类继承IService的实现类要传递baseMapper给ServiceImpl(IService的实现类)是因为调用Mapper方法时要知道要调用哪一个类的Mapper。

dllxhcjla的博客 434

JP4-1-1-MyLesson项目简介

MyLesson项目简介,包括项目介绍,权限介绍,环境介绍,技术栈介绍,环境初始化操作,数据库表的创建等。

周航宇的博客 2723

LangChain融资12.5亿美元背后:从AI原型到生产级代理工程的实战演进

如果你是一名AI应用开发者,或者正在关注大模型技术栈的演进,最近可能被一条新闻刷屏了: LangChain 宣布完成1.25亿美元融资,估值达到12.5亿美元 。 这不仅仅是一条普通的融资新闻。对于一个开源项目起家的公司来说,这个数字背后传递的信号是: 大模型应用开发,正在从一个“玩具”“原型”阶段,快速进入一个需要工程化、平台化规模化支撑的“生产”阶段。 而LangChain,正试图将自己定位为这个新时代的“代理工程平台”。 但问题来了:作为一个开发者,我们为什么要关心一家公司的融资?LangChai

weixin_33923762的博客 415

ElasticSearchElasticSearch中字符串.keyword.text类型区别模糊查询

在使用es对某个字符串字段进行模糊查询的时候,可能因为该字段是text类型而搜索不到,因为text类型会将字符串进行分词之后存入索引,那么我们在模糊查询的时候其实是基于已分词的词组进行的模糊查询,这样会导致本来应该查询出来的数据有可能会查询不到。所以可以通过keyword来进行精确匹配,这里记录一下对estextkeyword的理解使用,有不足的欢迎码友指正。 一、textkeyword类型介绍 1.ES5.0及以后的版本取消了string类型,将原先的string类型拆分为textkeyword

sfh2018的博客 3万+
上一篇: Elasticsearch(一)安装并使用
下一篇: springcloud微服务
Naaaaa.a
博客等级 码龄8年 30粉丝 79原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naaaaa.a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值