Kevin's blog Kevin's blog
首页
  • Java基础
  • Java高级
  • MySQL
  • JDBC
  • Java 8新特性
  • 原生Servlet
  • 延迟队列
  • 分布式事务
  • ActiveMQ
  • Elasticsearch
  • Stream API
  • Redis 实战(黑马程序员)
  • Redis 课程(尚硅谷)
  • Redis数据类型和常用命令
  • 版本控制
  • Spring Framework
  • Spring MVC Framework
  • MyBatis Framework
  • MyBatis Plus Framework
  • Spring Boot Framework
  • 韩顺平 Spring Boot Framework
  • 在线教育
  • 谷粒商城 - 分布式基础 高级 集群
  • 谷粒商城 - 详细开发文档
  • docker基础
  • docker-compose容器编排
  • docker swarm集群管理
  • Vue2基础
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Kevin

Java系统笔记
首页
  • Java基础
  • Java高级
  • MySQL
  • JDBC
  • Java 8新特性
  • 原生Servlet
  • 延迟队列
  • 分布式事务
  • ActiveMQ
  • Elasticsearch
  • Stream API
  • Redis 实战(黑马程序员)
  • Redis 课程(尚硅谷)
  • Redis数据类型和常用命令
  • 版本控制
  • Spring Framework
  • Spring MVC Framework
  • MyBatis Framework
  • MyBatis Plus Framework
  • Spring Boot Framework
  • 韩顺平 Spring Boot Framework
  • 在线教育
  • 谷粒商城 - 分布式基础 高级 集群
  • 谷粒商城 - 详细开发文档
  • docker基础
  • docker-compose容器编排
  • docker swarm集群管理
  • Vue2基础
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Java基础

  • Java高级

  • MySQL

  • JDBC

  • Java8新特性

  • 原生Servlet

  • 延迟队列

  • 分布式事务

  • ActiveMQ

  • Elasticsearch

    • Elasticsearch
      • 一、 全文检索工具elasticsearch
        • 1 lucene与elasticsearch
        • 2 elasticSearch的使用场景
        • 3 elasticSearch的安装
        • 4 elasticsearch的基本概念
        • 5 利用kibana学习 elasticsearch restful api (DSL)
        • 5.1 es中保存的数据结构
        • 5.2 对数据的操作
        • 5.2.1 查看es中有哪些索引
        • 5.2.2 增加一个索引
        • 5.2.3 删除一个索引
        • 5.2.4 新增文档
        • 5.2.5 直接用id查找
        • 5.2.6 修改—整体替换
        • 5.2.7 修改—某个字段 更新es商品中的排名
        • 5.2.8 删除一个document
        • 5.2.9 搜索type全部数据
        • 5.2.10 按条件查询(全部)
        • 5.2.11 按分词查询
        • 5.2.12 按分词子属性查询
        • 5.2.13 match phrase 按词组查询
        • 5.2.14 fuzzy查询
        • 5.2.15 过滤--查询后过滤
        • 5.2.16 过滤--查询前过滤(推荐)
        • 5.2.17 过滤--按范围过滤
        • 5.2.18 排序
        • 5.2.19 分页查询
        • 5.2.20 指定查询的字段
        • 5.2.21 高亮
        • 5.2.22 聚合
        • 5.3 关于mapping
        • 5.4 中文分词
        • 5.4.1 安装
        • 5.4.2 测试使用
        • 5.4.3 基于中文分词搭建索引
        • 5.4.4 自定义词库
      • 二、 Java程序中的应用
        • 1 、搭建模块
        • 2、 关于es 的java 客户端的选择
        • 3 、在gmall-list-service项目中导入Jest依赖
        • 4 、在测试类中测试ES
  • Stream

  • 黑马程序员Redis实战

  • 版本控制

  • Java
  • Elasticsearch
zhihuanwang
2023-10-25
目录

Elasticsearch

资料来源: 鱼皮推荐-电商项目

# 一、 全文检索工具elasticsearch

如果es打不开:卸掉,把一些不相关tar.gz 删掉!

# 1 lucene与elasticsearch

咱们之前讲的处理分词,构建倒排索引,等等,都是这个叫lucene的做的。那么能不能说这个lucene就是搜索引擎呢?

还不能。lucene只是一个提供全文搜索功能类库的核心工具包,而真正使用它还需要一个完善的服务框架搭建起来的应用。

好比lucene是类似于jdk,而搜索引擎软件就是tomcat 的。

目前市面上流行的搜索引擎软件,主流的就两款,elasticsearch和solr,这两款都是基于lucene的搭建的,可以独立部署启动的搜索引擎服务软件。由于内核相同,所以两者除了服务器安装、部署、管理、集群以外,对于数据的操作,修改、添加、保存、查询等等都十分类似。就好像都是支持sql语言的两种数据库软件。只要学会其中一个另一个很容易上手。

从实际企业使用情况来看,elasticSearch的市场份额逐步在取代solr,国内百度、京东、新浪都是基于elasticSearch实现的搜索功能。国外就更多了 像维基百科、GitHub、Stack Overflow等等也都是基于ES的

# 2 elasticSearch的使用场景

  1. 为用户提供按关键字查询的全文搜索功能。
  2. 著名的ELK框架(ElasticSearch,Logstash,Kibana),实现企业海量日志的处理分析的解决方案。大数据领域的重要一份子。

# 3 elasticSearch的安装

详见《elasticSearch的安装手册》

# 4 elasticsearch的基本概念

cluster 整个elasticsearch 默认就是集群状态,整个集群是一份完整、互备的数据。
node 集群中的一个节点,一般只一个进程就是一个node
Shard 分片,即使是一个节点中的数据也会通过hash算法,分成多个片存放,默认是5片。
Index 相当于rdbms的database, 对于用户来说是一个逻辑数据库,虽然物理上会被分多个shard存放,也可能存放在多个node中。
Type 类似于rdbms的table,但是与其说像table,其实更像面向对象中的class , 同一Json的格式的数据集合。
Document 类似于rdbms的 row、面向对象里的object
Field 相当于字段、属性

# 5 利用kibana学习 elasticsearch restful api (DSL)

# 5.1 es中保存的数据结构

public class  Movie {
	 String id;
     String name;
     Double doubanScore;
     List<Actor> actorList;
}

public class Actor{
String id;
String name;
}
1
2
3
4
5
6
7
8
9
10
11

这两个对象如果放在关系型数据库保存,会被拆成2张表,但是elasticsearch是用一个json来表示一个document。

所以它保存到es中应该是:

{
  “id”:”1”,
  “name”:”operation red sea”,
  “doubanScore”:”8.5”,
  “actorList”:[  
{“id”:”1”,”name”:”zhangyi”},
{“id”:”2”,”name”:”haiqing”},
{“id”:”3”,”name”:”zhanghanyu”}
]
}
1
2
3
4
5
6
7
8
9
10

# 5.2 对数据的操作

# 5.2.1 查看es中有哪些索引
GET /_cat/indices?v

es 中会默认存在一个名为.kibana的索引

表头的含义

health green(集群完整) yellow(单点正常、集群不完整) red(单点不正常)
status 是否能使用
index 索引名
uuid 索引统一编号
pri 主节点几个
rep 从节点几个
docs.count 文档数
docs.deleted 文档被删了多少
store.size 整体占空间大小
pri.store.size 主节点占
# 5.2.2 增加一个索引
PUT /movie_index
# 5.2.3 删除一个索引

ES 是不删除也不修改任何数据 ,伪删除更新当前index的版本。

DELETE /movie_index
# 5.2.4 新增文档
  1. 格式 PUT /index/type/id
PUT /movie_index/movie/1
{ "id":1,
  "name":"operation red sea",
  "doubanScore":8.5,
  "actorList":[  
{"id":1,"name":"zhang yi"},
{"id":2,"name":"hai qing"},
{"id":3,"name":"zhang han yu"}
]
}
PUT /movie_index/movie/2
{
  "id":2,
  "name":"operation meigong river",
  "doubanScore":8.0,
  "actorList":[  
{"id":3,"name":"zhang han yu"}
]
}

PUT /movie_index/movie/3
{
  "id":3,
  "name":"incident red sea",
  "doubanScore":5.0,
  "actorList":[  
{"id":4,"name":"liu de hua"}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

如果之前没建过index或者type,es 会自动创建。

# 5.2.5 直接用id查找
GET movie_index/movie/1
# 5.2.6 修改—整体替换

和新增没有区别

PUT /movie_index/movie/3
{
  "id":"3",
  "name":"incident red sea",
  "doubanScore":"5.0",
  "actorList":[  
{"id":"1","name":"zhang guo li"}
]
}

1
2
3
4
5
6
7
8
9
10
# 5.2.7 修改—某个字段 更新es商品中的排名
POST movie_index/movie/3/_update
{ 
  "doc": {
    "doubanScore":"7.0"
  } 
}

1
2
3
4
5
6
7
# 5.2.8 删除一个document
DELETE movie_index/movie/3
# 5.2.9 搜索type全部数据
GET movie_index/movie/_search

结果

{
  "took": 2,    //耗费时间 毫秒
  "timed_out": false, //是否超时
  "_shards": {
    "total": 5,   //发送给全部5个分片
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,  //命中3条数据
    "max_score": 1,   //最大评分
    "hits": [  // 结果
      {
        "_index": "movie_index",
        "_type": "movie",
        "_id": 2,
        "_score": 1,
        "_source": {
          "id": "2",
          "name": "operation meigong river",
          "doubanScore": 8.0,
          "actorList": [
            {
              "id": "1",
              "name": "zhang han yu"
            }
          ]
        }
          。。。。。。。。
          。。。。。。。。
      }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 5.2.10 按条件查询(全部)
GET movie_index/movie/_search
{
  "query":{
    "match_all": {}
  }
}
1
2
3
4
5
6
# 5.2.11 按分词查询
GET movie_index/movie/_search
{
  "query":{
    "match": {"name":"red"}
  }
}
1
2
3
4
5
6

注意结果的评分

# 5.2.12 按分词子属性查询
GET movie_index/movie/_search
{
  "query":{
    "match": {"actorList.name":"zhang"}
  }
}
1
2
3
4
5
6
# 5.2.13 match phrase 按词组查询
GET movie_index/movie/_search
{
    "query":{
      "match_phrase": {"name":"operation red"}
    }
}
1
2
3
4
5
6

按短语查询,不再利用分词技术,直接用短语在原始数据中匹配

# 5.2.14 fuzzy查询
GET movie_index/movie/_search
{
    "query":{
      "fuzzy": {"name":"rad"}
    }
}
1
2
3
4
5
6

校正匹配分词,当一个单词都无法准确匹配,es通过一种算法对非常接近的单词也给与一定的评分,能够查询出来,但是消耗更多的性能。

# 5.2.15 过滤--查询后过滤
GET movie_index/movie/_search
{
    "query":{
      "match": {"name":"red"}
    },
    "post_filter":{
      "term": {
        "actorList.id": 3
      }
    }
}
1
2
3
4
5
6
7
8
9
10
11
# 5.2.16 过滤--查询前过滤(推荐)

其实准确来说,ES中的查询操作分为2种:查询(query)和过滤(filter)。查询即是之前提到的query查询,它**(查询)默认会计算每个返回文档的得分,然后根据得分排序**。而**过滤(filter)只会筛选出符合的文档,并不计算得分,且它可以缓存文档。**所以,单从性能考虑,过滤比查询更快。 换句话说,过滤适合在大范围筛选数据,而查询则适合精确匹配数据。一般应用时,应先使用过滤操作过滤数据,然后使用查询匹配数据。

GET movie_index/movie/_search
{ 
    "query":{
        "bool":{
          "filter":[ {"term": {  "actorList.id": "1"  }},
                     {"term": {  "actorList.id": "3"  }}
           ], 
           "must":{"match":{"name":"red"}}
         }
    }
}
1
2
3
4
5
6
7
8
9
10
11

term、terms过滤 term、terms的含义与查询时一致。term用于精确匹配、terms用于多词条匹配。不过既然过滤器适用于大氛围过滤,term、terms在过滤中使用意义不大。在项目中建议使用term。 Term: where id = ? Terms: where id in () ## select * from skuInfo where id=? Select * from skuInfo where id in ()

# 5.2.17 过滤--按范围过滤
GET movie_index/movie/_search
{
   "query": {
     "bool": {
       "filter": {
         "range": {
            "doubanScore": {"gte": 8}
         }
       }
     }
   }
}
1
2
3
4
5
6
7
8
9
10
11
12

关于范围操作符:跟html标签中的转义字符一样!

gt 大于
lt 小于
gte 大于等于
lte 小于等于
# 5.2.18 排序
GET movie_index/movie/_search
{
  "query":{
    "match": {"name":"red sea"}
  }
  , "sort": [
    {
      "doubanScore": {
        "order": "desc"
      }
    }
  ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13

面试题:

Mysql 默认升序

Oracle 默认是升序

Sqlserver 默认是升序

端口号不一样,分页语句不一样!

3306 1521 1433

Limit rownum top

# 5.2.19 分页查询
GET movie_index/movie/_search
{
  "query": { "match_all": {} },
// 第几条开始查询!
  "from": 1,
  "size": 1
}
1
2
3
4
5
6
7
# 5.2.20 指定查询的字段
GET movie_index/movie/_search
{
  "query": { "match_all": {} },
  "_source": ["name", "doubanScore"]
}
1
2
3
4
5
# 5.2.21 高亮
GET movie_index/movie/_search
{
    "query":{
      "match": {"name":"red sea"}
    },
    "highlight": {
      "fields": {"name":{} }
    }
    
}
1
2
3
4
5
6
7
8
9
10
修改自定义高亮标签
GET movie_index/movie/_search
{
    "query":{
      "match": {"name":"red sea"}
    },
    "highlight": {
      "post_tags": ["</span>"],
      "pre_tags": ["<span>"], 
      "fields": {"name":{} }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
# 5.2.22 聚合

取出每个演员共参演了多少部电影 – sql : group by !

GET movie_index/movie/_search
{ 
  "aggs": {
    "groupby_actor": {
      "terms": {
        "field": "actorList.name.keyword"  
      }
    } 
  }
}
1
2
3
4
5
6
7
8
9
10

每个演员参演电影的平均分是多少,并按评分排序

GET movie_index/movie/_search
{ 
  "aggs": {
    "groupby_actor_id": {
      "terms": {
        "field": "actorList.name.keyword" ,
        "order": {
          "avg_score": "desc"
          }
      },
      "aggs": {
        "avg_score":{
          "avg": {
            "field": "doubanScore" 
          }
        }
       }
    } 
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 5.3 关于mapping

之前说type可以理解为table,那每个字段的数据类型是如何定义的呢

查看看mapping

GET movie_index/_mapping/movie

实际上每个type中的字段是什么数据类型,由mapping定义。

但是如果没有设定mapping系统会自动,根据一条数据的格式来推断出应该的数据格式。

  • true/false → boolean
  • 1020 → long
  • 20.1 → double,float
  • “2018-02-01” → date
  • “hello world” → text +keyword

默认只有text会进行分词,keyword是不会分词的字符串。

mapping除了自动定义,还可以手动定义,但是只能对新加的、没有数据的字段进行定义。一旦有了数据就无法再做修改了。

注意:虽然每个Field的数据放在不同的type下,但是同一个名字的Field在一个index下只能有一种mapping定义。

# 5.4 中文分词

elasticsearch本身自带的中文分词,就是单纯把中文一个字一个字的分开,根本没有词汇的概念。但是实际应用中,用户都是以词汇为条件,进行查询匹配的,如果能够把文章以词汇为单位切分开,那么与用户的查询条件能够更贴切的匹配上,查询速度也更加快速。

分词器下载网址:https://github.com/medcl/elasticsearch-analysis-ik (opens new window)

# 5.4.1 安装

下载好的zip包,请解压后放到 /usr/share/elasticsearch/plugins/

[root@localhost plugins]## unzip elasticsearch-analysis-ik-5.6.4.zip

image-20250926010939444

将压缩包文件删除!否则启动失败!

然后重启es

[root@localhost plugins]## service elasticsearch restart

# 5.4.2 测试使用

使用默认

GET movie_index/_analyze
{  
  "text": "我是中国人"
}
1
2
3
4

请观察结果

使用分词器

GET movie_index/_analyze
{  "analyzer": "ik_smart", 
  "text": "我是中国人"
}
1
2
3
4

请观察结果

另外一个分词器

ik_max_word

GET movie_index/_analyze
{  "analyzer": "ik_max_word", 
  "text": "我是中国人"
}
1
2
3
4

请观察结果

能够看出不同的分词器,分词有明显的区别,所以以后定义一个type不能再使用默认的mapping了,要手工建立mapping, 因为要选择分词器。

# 5.4.3 基于中文分词搭建索引

1、建立mapping

PUT movie_chn
{
  "mappings": {
    "movie":{
      "properties": {
        "id":{
          "type": "long"
        },
        "name":{
          "type": "text"
          , "analyzer": "ik_smart"
        },
        "doubanScore":{
          "type": "double"
        },
        "actorList":{
          "properties": {
            "id":{
              "type":"long"
            },
            "name":{
              "type":"keyword"
            }
          }
        }
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

插入数据

PUT /movie_chn/movie/1
{ "id":1,
  "name":"红海行动",
  "doubanScore":8.5,
  "actorList":[  
  {"id":1,"name":"张译"},
  {"id":2,"name":"海清"},
  {"id":3,"name":"张涵予"}
 ]
}
PUT /movie_chn/movie/2
{
  "id":2,
  "name":"湄公河行动",
  "doubanScore":8.0,
  "actorList":[  
{"id":3,"name":"张涵予"}
]
}

PUT /movie_chn/movie/3
{
  "id":3,
  "name":"红海事件",
  "doubanScore":5.0,
  "actorList":[  
{"id":4,"name":"张国立"}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

查询测试

GET /movie_chn/movie/_search
{
  "query": {
    "match": {
      "name": "红海战役"
    }
  }
}

GET /movie_chn/movie/_search
{
  "query": {
    "term": {
      "actorList.name": "张译"
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 5.4.4 自定义词库

什么使用?

当词库满足不了你的需要,可以使用自定义词库!

修改/usr/share/elasticsearch/plugins/ik/config/中的IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict"></entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
         <entry key="remote_ext_dict">http://192.168.67.163/fenci/myword.txt</entry>
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
1
2
3
4
5
6
7
8
9
10
11
12
13

按照标红的路径利用nginx发布静态资源

在nginx.conf中配置

  server {
        listen  80;
        server_name  192.168.67.163;
        location /fenci/ {
           root es;
    }
   }
1
2
3
4
5
6
7

并且在/usr/local/nginx/下建/es/fenci/目录,目录下加myword.txt

myword.txt中编写关键词,每一行代表一个词。

image-20250926011023054

然后重启es服务器,重启nginx。

在kibana中测试分词效果

image-20250926011033965

更新完成后,es只会对新增的数据用新词分词。历史数据是不会重新分词的。如果想要历史数据重新分词。需要执行:

POST movies_index_chn/_update_by_query?conflicts=proceed

# 二、 Java程序中的应用

# 1 、搭建模块

image-20250926011053859

image-20250926011104817

image-20250926011112222

pom.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.atguigu.gmall</groupId>
   <artifactId>gmall-list-service</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>gmall-list-service</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>com.atguigu.gmall</groupId>
      <artifactId>gmall-parent</artifactId>
      <version>1.0-SNAPSHOT</version>
   </parent>
   <dependencies>

      <dependency>
         <groupId>com.atguigu.gmall</groupId>
         <artifactId>gmall-interface</artifactId>
         <version>1.0-SNAPSHOT</version>
      </dependency>

      <dependency>
         <groupId>com.atguigu.gmall</groupId>
         <artifactId>gmall-service-util</artifactId>
         <version>1.0-SNAPSHOT</version>
      </dependency>

   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

# 2、 关于es 的java 客户端的选择

目前市面上有两类客户端

一类是TransportClient 为代表的ES原生客户端,不能执行原生dsl语句必须使用它的Java api方法。

另外一种是以Rest Api为主的missing client,最典型的就是jest。 这种客户端可以直接使用dsl语句拼成的字符串,直接传给服务端,然后返回json字符串再解析。

两种方式各有优劣,但是最近elasticsearch官网,宣布计划在7.0以后的版本中废除TransportClient。以RestClient为主。

image-20250926011137990

所以在官方的RestClient 基础上,进行了简单包装的Jest客户端,就成了首选,而且该客户端也与springboot完美集成。

# 3 、在gmall-list-service项目中导入Jest依赖

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

<!-- https://mvnrepository.com/artifact/io.searchbox/jest -->
<dependency>
   <groupId>io.searchbox</groupId>
   <artifactId>jest</artifactId>
</dependency>

<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
<dependency>
   <groupId>net.java.dev.jna</groupId>
   <artifactId>jna</artifactId>
 </dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

其中jest和jna请将版本号,部分纳入gmall-parent中管理。spring-boot-starter-data-elasticsearch不用管理版本号,其版本跟随springboot的1.5.10大版本号。

# 4 、在测试类中测试ES

application.properties中加入

server.port=8085
logging.level.root=error
spring.dubbo.application.name=list-service
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=192.168.67.203:2181
spring.dubbo.base-package=com.atguigu.gmall0319
spring.dubbo.protocol.name=dubbo
spring.datasource.url=jdbc:mysql://localhost:3306/gmall?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#mybatis
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
mybatis.configuration.mapUnderscoreToCamelCase=true

## redis
spring.redis.host=192.168.67.203
spring.redis.port=6379
spring.redis.database=0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
spring.elasticsearch.jest.uris=http://192.168.67.163:9200

在springBoot 测试类 中添加

@Autowired
JestClient jestClient;

@Test
public void testEs() throws IOException {
   String query="{\n" +
         "  \"query\": {\n" +
         "    \"match\": {\n" +
         "      \"actorList.name\": \"张译\"\n" +
         "    }\n" +
         "  }\n" +
         "}";
   Search search = new Search.Builder(query).addIndex("movie_chn").addType("movie").build();

   SearchResult result = jestClient.execute(search);

   List<SearchResult.Hit<HashMap, Void>> hits = result.getHits(HashMap.class);

   for (SearchResult.Hit<HashMap, Void> hit : hits) {
      HashMap source = hit.source;
      System.err.println("source = " + source);
   }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

打印结果:

image-20250926011206275

以上技术方面的准备就做好了。下面回到咱们电商的业务

编辑 (opens new window)
上次更新: 2024/06/15, 15:12:25
Activemq
Stream

← Activemq Stream→

最近更新
01
04.Spring Boot 韩顺平
10-12
02
day14
08-29
03
day09
08-29
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式