我们一起成长(一)elasticsearch + spring boot (上篇)

Elasticsearch基础篇


前言

公司数据越来越多,海量数据在MySQL中的普通查询以及满足不了需求,所以公司买了阿里云的elastic search服务,使用中遇到了很多问题在这里记录并分享给大家,欢迎我们随时交流


本文章主要还是以spring boot集成ES实战为主,会简单带大家了解一些ES基础知识点
上篇是针对ES的基础语法做了一些简单的介绍,并不包含全部语法,如果大家想从头详细的学习ES还请结合官方文档+网上资料去好好的学习
下篇是更详细的spring boot集成ES的一些API的介绍,想了解这部分的同学直接去下篇即可

一、elastic search是什么?

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。

二、我们要掌握哪些知识点

1.索引

ES中的索引你可以理解为MySQL中的,是数据的集合

我这里用的是阿里云Elasticsearch,版本为7.7.1,自带kibana控制台,下面的操作指令都是在kibana中执行

  • 创建索引
  • PUT /kol_account_weibo1
    叫我红领巾

我这里创建了一个叫kol_account_weibo1的索引,看右边的执行结果,显示成功,那我们紧接着查询一下

  • 查询索引
  • GET /kol_account_weibo1
    叫我红领巾

右边为这个索引的基础信息,包括aliases(索引的别名)mappings(索引的字段信息) 等等
mappings里面有很多知识点,我这里不做讲解,想了解的大家去网上找找资料好好学习

  • 设置索引别名
POST _aliases
{
 "actions": [
   {
     "add": {
       "index": "kol_account_weibo1",
       "alias": "kol_account_weibo"
     }
   }
 ]
}

叫我红领巾

index是索引名,alias为要设置的别名

  • 移除索引别名
POST _aliases
{
  "actions": [
    {
      "remove": {
        "index": "kol_account_weibo1",
        "alias": "kol_account_weibo"
      }
    }
  ]
}

在这里插入图片描述

index为索引名,alias为要移除的别名

  • 查询全部索引信息

  • GET _cat/indices
    在这里插入图片描述

  • 删除索引(谨慎使用)

  • DELETE /kol_account_weibo1在这里插入图片描述

  • 根据通配符删除索引(谨慎使用)

  • DELETE /kol_*

2.写入数据

  • 插入文档(不指定_id,随机生成)
POST /kol_account_weibo1/_doc
{
  "username":"微博管理员",
  "fansnum":158581104,
  "area":"北京",
  "level":1
}

在这里插入图片描述

  • 插入文档(指定_id)
POST /kol_account_weibo1/_doc/123456789
{
  "username":"微博小秘书",
  "fansnum":198130473,
  "area":"中国",
  "level":1
}

在这里插入图片描述

3.查询数据

  • 普通查询
  • GET /kol_account_weibo1/_search在这里插入图片描述

这个查询默认返回10条数据

  • 分页查询
GET /kol_account_weibo1/_search
{
  "size": 10,
  "from": 0,
  "sort": [
    {
      "fansnum": {
        "order": "desc"
      }
    }
  ]
}

在这里插入图片描述

size:每页展示数量
from:当前页数
sort:根据哪个字段进行排序,这里是根据fansnum排序

有一点值得注意的是,当这个索引中的数据超过1W条的时候,普通查询是不能查出具体数量的
(在ES 7.x的版本中是这样的,听说6.x的版本会返回具体数量,这个我没有验证过)
如下图

在这里插入图片描述

这个索引中的数据量很多,普通查询无法展示出具体的数据量
引入track_total_hits参数,设置为true,放入查询体中,就会查出具体数量

  • "track_total_hits": true
    在这里插入图片描述

4.更新数据

ES中更新某一条数据的全部字段信息,用指定_id的插入语句即可,我不做赘述,这里我只介绍一种更新部分字段信息

  • 根据id更新部分字段
 POST /kol_account_weibo1/_update/123456789
{
  "doc": {
    "level": 5
  }
}

在这里插入图片描述

5.删除数据

  • 指定id删除
  • DELETE /kol_account_weibo1/_doc/123456789
    在这里插入图片描述
  • 查询删除(批量删除)
  • _delete_by_query
POST /kol_account_weibo1/_delete_by_query
{
  "query": {
    "bool": {
      "adjust_pure_negative": true,
      "must": [
        {
          "match": {
            "username.keyword": {
              "auto_generate_synonyms_phrase_query": true,
              "query": "微博",
              "zero_terms_query": "NONE",
              "fuzzy_transpositions": true,
              "boost": 1,
              "prefix_length": 0,
              "operator": "OR",
              "lenient": false,
              "max_expansions": 50
            }
          }
        }
      ],
      "boost": 1
    }
  },
  "track_total_hits": true
}

在这里插入图片描述

我这里是根据username查询并删除等于”微博’“的数据,右边会显示执行结果
total代表查询到的数量,deleted代表删除数量

5.数据类型(嵌套对象)

PUT /kol_account_dy_v1
{
  "settings": {
    "index": {
      "analysis.analyzer.default.type": "ik_smart",
      "number_of_shards": "3",
      "number_of_replicas": "1"
    }
  },
  "mappings": {
    "properties": {
      "accountIcon": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "accountName": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "accountNo": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "ageOfFans": {
          "type" : "nested",
          "properties" : {
            "name" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "rate" : {
              "type" : "float"
            }
          }
        }
    }
  }
}

创建包含nested的Mappings

  • 查询ageOfFans中,
    ageOfFans.rate(比例) 在0.2-0.3之间,且 ageOfFans.name(年龄区间) 在35-44岁之间,
    或者
    ageOfFans.rate(比例) 在0.25-0.3之间,且ageOfFans.name(年龄区间) 在25-34岁之间
GET /kol_account_xhs_test/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "nested": {
            "path": "ageOfFans",
            "query": {
              "bool": {
                "must": [
                  {
                    "range": {
                      "ageOfFans.rate": {
                        "from": "0.2",
                        "to": "0.3"
                      }
                    }
                  },
                  {
                    "match": {
                      "ageOfFans.name.keyword": "35-44"
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "ageOfFans",
            "query": {
              "bool": {
                "must": [
                  {
                    "range": {
                      "ageOfFans.rate": {
                        "from": "0.25",
                        "to": "0.3"
                      }
                    }
                  },
                  {
                    "match": {
                      "ageOfFans.name.keyword": "25-34"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  },
  "track_total_hits": true
}

在这里插入图片描述

注意:将字段类型设置为 nested 而不是 object 后,每一个嵌套对象都会被索引为一个 隐藏的独立文档。
所以当我们用命令GET _cat/indices查看该index下的数据总数时,会远远大于实际数量,这是因为一个数据被拆成了多个独立文档存储的缘故,所以当我们把mappings中的某些字段改为nested类型时,看到数据倍增不要惊讶哦,用下面这个查询去具体的索引里面才能看到实际的数据条数哦

GET /kol_account_xhs/_search
{
  "track_total_hits": true
}

三、MySQL转Elasticsearch

由于ES语法是JSON格式,复杂查询需要写的语句更是千变万化让人头大,我这里给大家推荐一个MySQL语句转ES语句的官方语法,应该能帮大家更好的去学习及灵活运用

POST /_sql/translate
{
  "query":"select * from  kol_account_weibo1  where username like '%雅诗%' order by fansnum limit 10000"
}

在这里插入图片描述

左边为MySQL语句,右边是具体的ES语法

总结

elastic search的功能非常强大,聚合查询,查询高亮等等的功能我就不一一列举了,能应用到的场景也是非常的多,能把这个学好肯定会对你有很大的帮助。
上篇的内容基本上已经结束,下篇就是我们spring boot+elasticsearch的实战,大家加油哦

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现搜索引擎一般需要以下步骤: 1. 数据库建表和数据导入:根据需要建立相应的数据库表,并导入数据。 2. Elasticsearch安装和配置:安装Elasticsearch,配置Elasticsearch集群,并将数据导入到Elasticsearch中。 3. Spring Boot和Vue.js项目搭建:使用Spring Boot和Vue.js框架搭建项目。 4. 搜索功能实现:使用Elasticsearch进行搜索功能的实现。 具体实现步骤如下: 1. 数据库建表和数据导入 根据需求建立相应的数据库表,并将数据导入到数据库中。这里以MySQL为例,建立一个books表: CREATE TABLE `books` ( `id` int NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL, `author` varchar(255) DEFAULT NULL, `content` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 将数据导入到books表中: INSERT INTO `books` (`id`, `title`, `author`, `content`) VALUES (1, 'Java编程思想', 'Bruce Eckel', 'Java编程思想是一本Java入门书籍。'), (2, 'Spring Boot实战', 'Craig Walls', 'Spring Boot实战是一本介绍Spring Boot框架的书籍。'), (3, 'Vue.js实战', '梁灏', 'Vue.js实战是一本介绍Vue.js框架的书籍。'); 2. Elasticsearch安装和配置 安装Elasticsearch,配置Elasticsearch集群,并将数据导入到Elasticsearch中。这里以Elasticsearch 7.2.0为例,安装步骤如下: (1)下载Elasticsearch 官网下载地址:https://www.elastic.co/downloads/elasticsearch (2)解压并启动Elasticsearch 解压后进入bin目录,执行以下命令启动Elasticsearch: ./elasticsearch (3)安装中文分词器 Elasticsearch默认使用英文分词器,需要安装中文分词器,这里使用IK Analyzer中文分词器。IK Analyzer的GitHub地址为:https://github.com/medcl/elasticsearch-analysis-ik 下载IK Analyzer插件: wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.2.0/elasticsearch-analysis-ik-7.2.0.zip 将插件安装到Elasticsearch中: ./elasticsearch-plugin install file:///path/to/elasticsearch-analysis-ik-7.2.0.zip (4)将数据导入到Elasticsearch使用ElasticsearchAPI数据库中的数据导入到Elasticsearch中。 3. Spring Boot和Vue.js项目搭建 使用Spring Boot和Vue.js框架搭建项目,这里不再赘述。 4. 搜索功能实现 (1)在Spring Boot使用Elasticsearch进行搜索 使用Spring Data Elasticsearch实现与Elasticsearch的交互,具体步骤如下: 1. 在pom.xml中添加Spring Data Elasticsearch依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> 2. 在application.yml中配置Elasticsearchspring: data: elasticsearch: cluster-name: elasticsearch cluster-nodes: 127.0.0.1:9300 3. 创建一个Book实体类,并使用@Document注解标注该实体类对应的Elasticsearch索引和类型: @Document(indexName = "books", type = "book") public class Book { @Id private Long id; private String title; private String author; private String content; // getter和setter方法省略 } 4. 创建一个BookRepository接口,继承ElasticsearchRepository接口: public interface BookRepository extends ElasticsearchRepository<Book, Long> { } 5. 在BookService中实现搜索功能: @Service public class BookService { @Autowired private BookRepository bookRepository; public List<Book> search(String keyword) { QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(keyword, "title", "author", "content"); Iterable<Book> iterable = bookRepository.search(queryBuilder); List<Book> books = new ArrayList<>(); iterable.forEach(books::add); return books; } } (2)在Vue.js中调用搜索接口 使用axios库调用Spring Boot的接口,具体步骤如下: 1. 安装axios库: npm install axios --save 2. 在Vue.js中调用搜索接口: <script> import axios from 'axios'; export default { data() { return { keyword: '', books: [] } }, methods: { search() { axios.get('/api/search?keyword=' + this.keyword).then(response => { this.books = response.data; }).catch(error => { console.log(error); }); } } } </script> 以上就是使用Spring Boot和Vue.js实现Elasticsearch搜索引擎的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值