ElasticSearch 7.8.1教程(from b站狂神)+JD商城仿站

ElasticSearch 7.8.1教程(from b站狂神)+JD商城仿站

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: http://blog.csdn.net/popofzk/article/details/108369532

ElasticSearch

安装elasticsearch

官网:elastic.co

https://www.elastic.co/cn/downloads/elasticsearch

官网下载巨慢,翻墙下载

目录

在这里插入图片描述

启动,访问9200:
在这里插入图片描述
在这里插入图片描述

访问9200接口:
在这里插入图片描述

安装elasticsearch-head:

git clone git://github.com/mobz/elasticsearch-head.git

cd elasticsearch-head

npm install

npm run start

open http://localhost:9100/

存在一个9200和9100的跨域问题!

点击链接,报跨域的错!

在这里插入图片描述

修改elasticsearch中config下的yaml配置文件,修改:

在这里插入图片描述

重启,连接成功:

在这里插入图片描述

把索引当做一个数据库!可以建立索引(库),文档(库中的数据!)

在这里插入图片描述
后面所有的查询,查询功能在Kibana中做!

了解ELK

在这里插入图片描述

安装Kibana

在这里插入图片描述

好处:ELK基本上都是拆箱即用

启动测试:点bin下的kibana

在这里插入图片描述

默认的kibana端口为5601

PS:注意elasticsearch和kibana的版本必须一致 否则出错!

开发工具:(Post curl head 谷歌浏览器插件测试)

汉化,修改kibana yaml中配置 重启,

ES核心概念

  1. 索引
  2. 字段类型(mapping)
  3. 文档(documents)

概述:

集群、节点、索引、类型、文档、分片、映射是什么?

elasticsearch是面向文档,关系型数据库和elasticsearch 客观的对比如下,一切都是JSON!

在这里插入图片描述
在这里插入图片描述

类型示例:

在这里插入图片描述
在这里插入图片描述

IK分词器

在这里插入图片描述
安装https://github.com/medcl/elasticsearch-analysis-ik/releases

放在elasticsearch的plugin(插件)下

重启观察ES

在这里插入图片描述

关于elasticsearch中的命令 如elasticsearch-plugin:

命令行输入:

elasticsearch-plugin list

    
    
  • 1

在kibana中测分词器:

我们输入 超级喜欢狂神或java

发现问题:狂神说被拆开了!

这种自己需要的词,需要自己加到我们的分词器字典中!

向ik分词器增加自己的配置

在这里插入图片描述
在这里插入图片描述

重启es、kibana

在这里插入图片描述

再次测试一下狂神说,看下效果!ik_max_word最细粒度划分

在这里插入图片描述
在这里插入图片描述

以后自定义dic、导入即可!

索引引擎里面最重要的首先就是分词

Rest风格说明

一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制!

在这里插入图片描述

基础测试

  1. 创建一个索引!也是在kibana终端中试用版PUT命令
 PUT /test1/type1/1{  
 "name": "狂神说", 
 "age": "3"
 } 

    
    
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
完成了自动增加索引!数据也成功的添加了,这就是可以当做数据库看的原因。。

  1. 那么name字段用不用指定类型呢?毕竟我们关系型数据库 是需要指定类型的啊!

    • 字符串类型 text、keyword
    • 数值类型 long、integer、short、byte、double、float、scaled float
    • 日期类型date
    • te布尔值类型boolean
    • 二进制类型binary
    • 等等。。。
  2. 指定字段的类型——创建规则


GET命令得到库的信息:


  1. 查看默认的信息

通过命令get _cat/可以获得es当前的很多信息!
在这里插入图片描述
在这里插入图片描述

修改 提交还是使用PUT即可!然后覆盖!最新办法

曾经的办法:

在这里插入图片描述

现在的方法 使用POST:

在这里插入图片描述

删除索引——DELETE
在这里插入图片描述

通过DELETE命令实现删除、根据你的请求来判断是删除索引还是删除文档记录!

使用RESTFUL风格是我们ES推荐大家使用的!

关于文档的基本操作(重点):

基本操作:

添加数据

在这里插入图片描述
在这里插入图片描述

更新数据,将小明改成小红

在这里插入图片描述

PUT更新数据

在这里插入图片描述

version代表被改变的次数

Post,_update自由度更高,PUT必须一次性修改一个个体的全部内容,但是Post可以选择部分修改!

在这里插入图片描述

这个和PUT无异,要在后加_update

在这里插入图片描述
在这里插入图片描述

简单的搜索:

GET Kuangshen/user/_search?q=name:狂神说

简单的条件查询,可以根据默认的映射规则,产生基本的查询!

复杂操作搜索 select(排序,分页,高亮,模糊查询,精准查询)

GET kuangshen/_search

    
    
  • 1

输出:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "kuangshen",
        "_type" : "user",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "狂神说",
          "age" : 23,
          "desc" : "一顿操作猛如虎,一看工资2500",
          "tags" : [
            "技术宅",
            "温暖",
            "直男"
          ]
        }
      },
      {
        "_index" : "kuangshen",
        "_type" : "user",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "name" : "张三",
          "age" : 3,
          "desc" : "法外狂徒",
          "tags" : [
            "交友",
            "旅游",
            "渣男"
          ]
        }
      },
      {
        "_index" : "kuangshen",
        "_type" : "user",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "name" : "李四",
          "age" : 30,
          "desc" : "不知道如何形容",
          "tags" : [
            "篮球",
            "IT",
            "型男"
          ]
        }
      },
      {
        "_index" : "kuangshen",
        "_type" : "user",
        "_id" : "4",
        "_score" : 1.0,
        "_source" : {
          "name" : "王五",
          "age" : 32,
          "desc" : "就是一个屌丝",
          "tags" : [
            "羽毛球",
            "钢琴",
            "渣男"
          ]
        }
      },
      {
        "_index" : "kuangshen",
        "_type" : "user",
        "_id" : "5",
        "_score" : 1.0,
        "_source" : {
          "name" : "狂神说Java8",
          "age" : 34,
          "desc" : "就是一个大帅哥",
          "tags" : [
            "围棋",
            "小提琴",
            "暖男"
          ]
        }
      }
    ]
  }
}

    
    
  • 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
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
GET kuangshen/_search
{
  "query": {
    "match": {
      "name": "狂神"
    }
  }
}

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出:

{
  "took" : 9,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.9034984,
    "hits" : [
      {
        "_index" : "kuangshen",
        "_type" : "user",
        "_id" : "1",
        "_score" : 1.9034984,
        "_source" : {
          "name" : "狂神说",
          "age" : 23,
          "desc" : "一顿操作猛如虎,一看工资2500",
          "tags" : [
            "技术宅",
            "温暖",
            "直男"
          ]
        }
      },
      {
        "_index" : "kuangshen",
        "_type" : "user",
        "_id" : "5",
        "_score" : 1.6534033,
        "_source" : {
          "name" : "狂神说Java8",
          "age" : 34,
          "desc" : "就是一个大帅哥",
          "tags" : [
            "围棋",
            "小提琴",
            "暖男"
          ]
        }
      }
    ]
  }
}

    
    
  • 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
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

hit: 索引和文档信息

查询的结果总数

然后就是查询出来的具体文档

数据中的东西都可以遍历出来

分数:通过score判断谁更加符合结果

指定字段查询:
GET kuangshen/_search
{
  "query": {
    "match": {
      "name": "狂神"
    }
  },
  "_source": ["name","desc"]
}

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

之后使用java操作es,所有的方法和对象就是这里面的key!

复杂操作:

排序

order中的desc降序、asc升序;按照age

GET kuangshen/_search
{
  "query": {
    "match": {
      "name": "狂神"
    }
  }
  ,"sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
分页
GET kuangshen/_search
{
  "query": {
    "match": {
      "name": "狂神"
    }
  }
  ,"sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 1
}

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

From:从第几个数据开始,返回多少条数据(单页面的数据)

数据下标还是从0开始的,和学的所有数据结构是一样的

/search/{current}/{pagesize}

布尔值查询

通过布尔值进行更加精确的查询:多条件精确查询

must命令(相当于mysql的and),即所有条件要同时符合;如果将must改为should(相当于or),则只要满足其一即可;

类似的 must not 查询不是。。

GET kuangshen/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "狂神说"
          }
        },
        {
          "match": {
            "age": 23
          }
        }
      ]
    }
  }
}

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
过滤器(filter)

筛选age范围

GET kuangshen/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "狂神"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "age": {
              "gte": 10,
              "lte": 40
            }
          }
        }
      ]
    }
  }
}

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • gt 大于
  • gte 大于等于
  • lt 小于
  • lte 小于等于
匹配多个条件

匹配出tags里面只要包含有男的,同时按照上到下分值高到低排列

GET kuangshen/user/_search
{
  "query": {
    "match": {
      "tags": "男 技术"
    }
  }
}

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

多个条件使用空格隔开

只要满足其中一个结果即可以被查出

这个时候可以通过分值基本的判断

精确查询

term查询是直接通过待排索引指定的词条进行精确的查找的!

关于分词:

term,直接查询精确的

match:会使用分词器解析!(先分析文档,然后再通过分析的文档进行查询!)

两个字段类型text keyword
 #新建db
 PUT testdb
 {
   "mappings": {
     "properties": {
       "name":{
         "type": "text"
       },
        "desc":{
          "type": "keyword"
        }      
     }
   }
 }
 #插入两条数据
 PUT testdb/_doc/1
 {
   "name": "狂神说Java name",
   "desc": "狂神说Java name"
 }

PUT testdb/_doc/2
{
“name”: “狂神说Java name”,
“desc”: “狂神说Java name2”
}

  • 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

在这里插入图片描述

 GET _analyze
 {
   "analyzer": "keyword",
   "text": "狂神说Java name"
 }

GET _analyze
{
“analyzer”: “standard”,
“text”: “狂神说Java name”
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述
在这里插入图片描述

由于desc的type是keyword,当做整体去搜索了

总结:keyword字段类型不会被分词器解析!

多个值匹配的精确查询

精确查询多个值

高亮查询
 GET kuangshen/user/_search
 {
   "query": {
     "match": {
       "name": "狂神说"
     }
   },
   "highlight": {
     "pre_tags": "<p class='key' style='color:red'>", 
     "post_tags": "</p>", 
     "fields": {
       "name": {}
     }
   }
 }

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

默认是<em>标签

在这里插入图片描述

也可以是自定义标签:设置pre_tags、post_tags

在这里插入图片描述

  • 匹配
  • 按照条件匹配
  • 精确匹配
  • 区间范围匹配
  • 匹配字段过滤
  • 多条件查询
  • 高亮查询

集成Springboot

文档

https://www.elastic.co/guide/index.html

在这里插入图片描述

找原生依赖

在这里插入图片描述

初始化

在这里插入图片描述

配置

新建一个empty project ,再创建普通模块

在这里插入图片描述

创建Springboot 模块:

在这里插入图片描述

勾上依赖:

在这里插入图片描述

由于刚刚建的空project,故要陪JDK环境

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题:一定要保证我们的导入依赖和我们的es版本一致

默认的导入依赖和我们本地的版本不一致!

可以自定义版本依赖,保证一致

新建config、ElasticSearchConfig.java`

package com.kuang.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;

//狂神的spring两步骤:
//1.找对象
//2.放到spring中用
@Configuration
public class ElasticSearchConfig {

<span class="token comment">//</span>
<span class="token annotation punctuation">@Bean</span>
<span class="token keyword">public</span> RestHighLevelClient <span class="token function">restHighLevelClient</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
    RestHighLevelClient client <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">RestHighLevelClient</span><span class="token punctuation">(</span>
            RestClient<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>
                    <span class="token keyword">new</span> <span class="token class-name">HttpHost</span><span class="token punctuation">(</span><span class="token string">"localhost"</span><span class="token punctuation">,</span> <span class="token number">9200</span><span class="token punctuation">,</span> <span class="token string">"http"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
                    <span class="token keyword">new</span> <span class="token class-name">HttpHost</span><span class="token punctuation">(</span><span class="token string">"localhost"</span><span class="token punctuation">,</span> <span class="token number">9201</span><span class="token punctuation">,</span> <span class="token string">"http"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> client<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

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

源码

在这里插入图片描述

具体测试es api:
package com.kuang;

import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;

//es 高级客户端测试API
@SpringBootTest
class KuangshenEsApiApplicationTests {
//面向对象来操作
@Autowired
@Qualifier(“restHighLevelClient”) //这里的qualifier用来指定下面的client为原始的restHighLevelClient
private RestHighLevelClient client;

<span class="token comment">// 测试索引的创建 Request</span>
<span class="token annotation punctuation">@Test</span>
<span class="token keyword">void</span> <span class="token function">testCreateIndex</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException <span class="token punctuation">{<!-- --></span>
	<span class="token comment">// 1.创建索引请求 相当于kibana中的PUT</span>
	CreateIndexRequest request <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">CreateIndexRequest</span><span class="token punctuation">(</span><span class="token string">"kuang_index"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token comment">// 2.执行创建请求IndicesClient ,请求后获得响应</span>
	CreateIndexResponse createIndexResponse <span class="token operator">=</span>
			client<span class="token punctuation">.</span><span class="token function">indices</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> RequestOptions<span class="token punctuation">.</span>DEFAULT<span class="token punctuation">)</span><span class="token punctuation">;</span>
	System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>createIndexResponse<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

//测试获取索引 判断是否存在某索引
@Test
void testExistIndex() throws IOException {
GetIndexRequest request = new GetIndexRequest(“kuang_index”);
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}

<span class="token comment">// 测试删除索引</span>
<span class="token annotation punctuation">@Test</span>
<span class="token keyword">void</span> <span class="token function">testDeleteIndex</span><span class="token punctuation">(</span><span class="token punctuation">)</span>  <span class="token keyword">throws</span> IOException <span class="token punctuation">{<!-- --></span>
	DeleteIndexRequest request <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DeleteIndexRequest</span><span class="token punctuation">(</span><span class="token string">"testdb2"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	AcknowledgedResponse delete <span class="token operator">=</span> client<span class="token punctuation">.</span><span class="token function">indices</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">delete</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> RequestOptions<span class="token punctuation">.</span>DEFAULT<span class="token punctuation">)</span><span class="token punctuation">;</span>
	System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>delete<span class="token punctuation">.</span><span class="token function">isAcknowledged</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 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
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

本来应该是private RestHighLevelClient restHighLevelClient;这里为了简便,所以用Qualifier来限定client为restHighLevelClient;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 创建索引
  • 判断索引是否存在
  • 删除索引
  • 创建文档
  • crud文档
创建文档

新建一个pojo,放入User.java

package com.kuang.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {
private String name;
private int age;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

由于要将我们的数据放入请求 json,故在pom中导入阿里巴巴fastjson

这里是将对象编写为Json,再放入es的request中

编写test类:

@Test
	void testAddDocument(){
		//创建对象
		User user = new User("狂神说",3);
		IndexRequest request = new IndexRequest("kuang_index");
	<span class="token comment">// 规则 put /kuang_index/_doc/1</span>
	request<span class="token punctuation">.</span><span class="token function">id</span><span class="token punctuation">(</span><span class="token string">"1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	request<span class="token punctuation">.</span><span class="token function">timeout</span><span class="token punctuation">(</span>TimeValue<span class="token punctuation">.</span><span class="token function">timeValueSeconds</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	request<span class="token punctuation">.</span><span class="token function">timeout</span><span class="token punctuation">(</span><span class="token string">"1s"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

	<span class="token comment">//将我们的数据放入请求 json</span>
	request<span class="token punctuation">.</span><span class="token function">source</span><span class="token punctuation">(</span>JSON<span class="token punctuation">.</span><span class="token function">toJSONString</span><span class="token punctuation">(</span>user<span class="token punctuation">)</span><span class="token punctuation">,</span> XContentType<span class="token punctuation">.</span>JSON<span class="token punctuation">)</span><span class="token punctuation">;</span>

	<span class="token comment">//客户端发送请求</span>
	IndexResponse indexResponse <span class="token operator">=</span> client<span class="token punctuation">.</span><span class="token function">index</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> RequestOptions<span class="token punctuation">.</span>DEFAULT<span class="token punctuation">)</span><span class="token punctuation">;</span>

	System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>indexResponse<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//</span>
	System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>indexResponse<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//对应我们命令返回的状态</span>
<span class="token punctuation">}</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在这里插入图片描述

获取文档
//获取文档的信息
	@Test
	void testGetDocument() throws IOException {
		GetRequest getRequest = new GetRequest("kuang_index", "1");
		GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
		System.out.println(getResponse.getSourceAsString());//打印文档的内容
		System.out.println(getResponse);//返回的全部内容和命令是一样的
	}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

更新文档信息
//更新文档的信息
	@Test
	void testUpdateDocument() throws IOException {
		UpdateRequest updateRequest = new UpdateRequest("kuang_index","1");
		updateRequest.timeout("1s");
	User user <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token string">"狂神说Java"</span><span class="token punctuation">,</span> <span class="token number">18</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	updateRequest<span class="token punctuation">.</span><span class="token function">doc</span><span class="token punctuation">(</span>JSON<span class="token punctuation">.</span><span class="token function">toJSONString</span><span class="token punctuation">(</span>user<span class="token punctuation">)</span><span class="token punctuation">,</span>XContentType<span class="token punctuation">.</span>JSON<span class="token punctuation">)</span><span class="token punctuation">;</span>

	UpdateResponse updateResponse <span class="token operator">=</span> client<span class="token punctuation">.</span><span class="token function">update</span><span class="token punctuation">(</span>updateRequest<span class="token punctuation">,</span> RequestOptions<span class="token punctuation">.</span>DEFAULT<span class="token punctuation">)</span><span class="token punctuation">;</span>
	System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>updateResponse<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token punctuation">}</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

删除文档信息
//删除文档记录
	@Test
	void testDeleteRequest() throws IOException {
		DeleteRequest request = new DeleteRequest("kuang_index", "1");
		request.timeout("1s");
	DeleteResponse deleteResponse <span class="token operator">=</span> client<span class="token punctuation">.</span><span class="token function">delete</span><span class="token punctuation">(</span>request<span class="token punctuation">,</span> RequestOptions<span class="token punctuation">.</span>DEFAULT<span class="token punctuation">)</span><span class="token punctuation">;</span>
	System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>deleteResponse<span class="token punctuation">.</span><span class="token function">status</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
批量插入
//批量插入数据
	@Test
	void testBulkRequest() throws IOException{
		BulkRequest bulkRequest = new BulkRequest();
		bulkRequest.timeout("10s");//数据量大的时候,秒数可以增加
	ArrayList<span class="token generics function"><span class="token punctuation">&lt;</span>User<span class="token punctuation">&gt;</span></span> userList <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token operator">&lt;</span><span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	userList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token string">"psz"</span><span class="token punctuation">,</span><span class="token number">11</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	userList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token string">"psz2"</span><span class="token punctuation">,</span><span class="token number">12</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	userList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token string">"psz3"</span><span class="token punctuation">,</span><span class="token number">13</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	userList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token string">"psz4"</span><span class="token punctuation">,</span><span class="token number">14</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	userList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token string">"psz5"</span><span class="token punctuation">,</span><span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token comment">//批处理请求</span>
	<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> userList<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
		bulkRequest<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>
				<span class="token keyword">new</span> <span class="token class-name">IndexRequest</span><span class="token punctuation">(</span><span class="token string">"kuang_index"</span><span class="token punctuation">)</span>
						<span class="token punctuation">.</span><span class="token function">id</span><span class="token punctuation">(</span><span class="token string">""</span><span class="token operator">+</span><span class="token punctuation">(</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
						<span class="token punctuation">.</span><span class="token function">source</span><span class="token punctuation">(</span>JSON<span class="token punctuation">.</span><span class="token function">toJSONString</span><span class="token punctuation">(</span>userList<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>XContentType<span class="token punctuation">.</span>JSON<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
	<span class="token comment">//请求+获得响应</span>
	BulkResponse bulkResponse <span class="token operator">=</span> client<span class="token punctuation">.</span><span class="token function">bulk</span><span class="token punctuation">(</span>bulkRequest<span class="token punctuation">,</span> RequestOptions<span class="token punctuation">.</span>DEFAULT<span class="token punctuation">)</span><span class="token punctuation">;</span>
	System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>bulkResponse<span class="token punctuation">.</span><span class="token function">hasFailures</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//返回false:成功</span>
<span class="token punctuation">}</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

在这里插入图片描述

查询

小技巧:

一般企业中,会把index名存在utils里面的ESconst.java文件中:

package com.kuang.utils;

public class ESconst {
public static final String ES_INDEX = “kuang_index”;
}

  • 1
  • 2
  • 3
  • 4
  • 5
// 查询
// SearchRequest 搜索请求
// SearchSourceBuilder 条件构造
// HighlightBuilder 构建高亮
// TermQueryBuilder 精确查询
// MatchAllQueryBuilder
// xxx QueryBuilder 对应我们刚才看到的命令
<span class="token annotation punctuation">@Test</span>
<span class="token keyword">void</span> <span class="token function">testSearch</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> IOException <span class="token punctuation">{<!-- --></span>
	SearchRequest searchRequest <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SearchRequest</span><span class="token punctuation">(</span>ESconst<span class="token punctuation">.</span>ES_INDEX<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token comment">// 构建搜索的条件</span>
	SearchSourceBuilder sourceBuilder <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SearchSourceBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	
	<span class="token comment">// 查询条件,可以使用querybuilders工具类实现</span>
	<span class="token comment">// QueryBuilders.termQuery精确匹配</span>
	<span class="token comment">// QueryBuilders.matchAllQuery匹配所有</span>
	TermQueryBuilder termQueryBuilder <span class="token operator">=</span> QueryBuilders<span class="token punctuation">.</span><span class="token function">termQuery</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span> <span class="token string">"qinjiang1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

// MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
sourceBuilder.query(termQueryBuilder);
//分页
// sourceBuilder.from();
// sourceBuilder.size();
// 设置查询的时间 希望在60s内查出
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

	System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>JSON<span class="token punctuation">.</span><span class="token function">toJSONString</span><span class="token punctuation">(</span>searchResponse<span class="token punctuation">.</span><span class="token function">getHits</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"--------------------------------------"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">for</span> <span class="token punctuation">(</span>SearchHit documentFields <span class="token operator">:</span> searchResponse<span class="token punctuation">.</span><span class="token function">getHits</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getHits</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
		System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>documentFields<span class="token punctuation">.</span><span class="token function">getSourceAsMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
  • 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

JD商城实战

新建Springboot initializr项目

导入es、fastjson等pom下的依赖

爬虫

数据问题?数据库获取,消息队列中获取,都可以成为数据源,或者爬虫

爬取数据:(获取请求返回的页面信息,筛选出我们想要的数据就可以了)

jsoup包:用于解析网页,不能爬电影

新建一个utils包放网页解析的工具类

在这里插入图片描述

本质的请求是:

https://search.jd.com/Search?keyword=java

在这里插入图片描述

所有在Js中的方法这里都可以使用

package com.kun.utils;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

public class HtmlParseUtil {
public static void main(String[] args) throws IOException {
// 获取请求 https://search.jd.com/Search?keyword=java
String url = “https://search.jd.com/Search?keyword=java”;
//解析网页 Jsoup返回的就是浏览器Document对象
Document document = Jsoup.parse(new URL(url), 30000);
Element element = document.getElementById(“J_goodsList”);
System.out.println(element.html());
//获取所有的li元素/标签
Elements elements = element.getElementsByTag(“li”);
//获取元素中的内容 eq获取当前第一个元素,获取src属性
for (Element el : elements) {
//关于这种图片特别多的网站,所有的图片都是延迟加载的!
String img = el.getElementsByTag(“img”).eq(0).attr(“src”);
String price = el.getElementsByClass(“p-price”).eq(0).text();
String title = el.getElementsByClass(“p-name”).eq(0).text();

        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"==============================="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>img<span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>title<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

输出结果

在这里插入图片描述

注意:

在图片较多的网站中,图片往往是延迟加载的,注意看图片的属性:

在这里插入图片描述

将获取到的元素 封装成对象,新建pojo,Content.java

package com.kun.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Content {
private String title;
private String img;
private String price;
//可以自己添加属性
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

再次封装工具类:

package com.kun.utils;

import com.kun.pojo.Content;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
@Component //丢进Springboot中
public class HtmlParseUtil {
public static void main(String[] args) throws Exception {
new HtmlParseUtil().parseJD(“java”).forEach(System.out::println);
}

<span class="token keyword">public</span> List<span class="token generics function"><span class="token punctuation">&lt;</span>Content<span class="token punctuation">&gt;</span></span> <span class="token function">parseJD</span><span class="token punctuation">(</span>String keywords<span class="token punctuation">)</span> <span class="token keyword">throws</span> Exception <span class="token punctuation">{<!-- --></span>
    <span class="token comment">// 获取请求 https://search.jd.com/Search?keyword=java</span>
    String url <span class="token operator">=</span> <span class="token string">"https://search.jd.com/Search?keyword="</span> <span class="token operator">+</span> keywords<span class="token punctuation">;</span>
    <span class="token comment">//解析网页 Jsoup返回的就是浏览器Document对象</span>
    Document document <span class="token operator">=</span> Jsoup<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">URL</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">30000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//所有你在js中可以使用的方法,这里都可以使用</span>
    Element element <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">"J_goodsList"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

// System.out.println(element.html());
//获取所有的li元素/标签
Elements elements = element.getElementsByTag(“li”);

    <span class="token comment">//封装对象</span>
    ArrayList<span class="token generics function"><span class="token punctuation">&lt;</span>Content<span class="token punctuation">&gt;</span></span> goodsList <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token generics function"><span class="token punctuation">&lt;</span>Content<span class="token punctuation">&gt;</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//获取元素中的内容  eq获取当前第一个元素,获取src属性</span>
    <span class="token keyword">for</span> <span class="token punctuation">(</span>Element el <span class="token operator">:</span> elements<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        <span class="token comment">//关于这种图片特别多的网站,所有的图片都是延迟加载的!</span>
        String img <span class="token operator">=</span> el<span class="token punctuation">.</span><span class="token function">getElementsByTag</span><span class="token punctuation">(</span><span class="token string">"img"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">eq</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">attr</span><span class="token punctuation">(</span><span class="token string">"src"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        String price <span class="token operator">=</span> el<span class="token punctuation">.</span><span class="token function">getElementsByClass</span><span class="token punctuation">(</span><span class="token string">"p-price"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">eq</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">text</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        String title <span class="token operator">=</span> el<span class="token punctuation">.</span><span class="token function">getElementsByClass</span><span class="token punctuation">(</span><span class="token string">"p-name"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">eq</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">text</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        Content content <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Content</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        content<span class="token punctuation">.</span><span class="token function">setImg</span><span class="token punctuation">(</span>img<span class="token punctuation">)</span><span class="token punctuation">;</span>
        content<span class="token punctuation">.</span><span class="token function">setPrice</span><span class="token punctuation">(</span>price<span class="token punctuation">)</span><span class="token punctuation">;</span>
        content<span class="token punctuation">.</span><span class="token function">setTitle</span><span class="token punctuation">(</span>title<span class="token punctuation">)</span><span class="token punctuation">;</span>
        goodsList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>content<span class="token punctuation">)</span><span class="token punctuation">;</span>

// System.out.println("===============================");
// System.out.println(img);
// System.out.println(price);
// System.out.println(title);
}
return goodsList;
}
}

  • 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
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

编写业务层service:

package com.kun.service;

import com.alibaba.fastjson.JSON;
import com.kun.pojo.Content;
import com.kun.utils.HtmlParseUtil;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;

import java.util.List;
//业务编写
@Service
public class ContentService {
@Autowired
private RestHighLevelClient restHighLevelClient;

<span class="token comment">//1.解析数据放入es索引中</span>
<span class="token keyword">public</span> Boolean <span class="token function">parseContent</span><span class="token punctuation">(</span>String keywords<span class="token punctuation">)</span> <span class="token keyword">throws</span> Exception <span class="token punctuation">{<!-- --></span>
    List<span class="token generics function"><span class="token punctuation">&lt;</span>Content<span class="token punctuation">&gt;</span></span> contents <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HtmlParseUtil</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">parseJD</span><span class="token punctuation">(</span>keywords<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//把查询的数据放入我们的es中</span>
    BulkRequest bulkRequest <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BulkRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    bulkRequest<span class="token punctuation">.</span><span class="token function">timeout</span><span class="token punctuation">(</span><span class="token string">"2m"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
			<span class="token comment">//批量插入</span>
    <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> contents<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        bulkRequest<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>
                <span class="token keyword">new</span> <span class="token class-name">IndexRequest</span><span class="token punctuation">(</span><span class="token string">"jd_goods"</span><span class="token punctuation">)</span>
                        <span class="token punctuation">.</span><span class="token function">source</span><span class="token punctuation">(</span>JSON<span class="token punctuation">.</span><span class="token function">toJSONString</span><span class="token punctuation">(</span>contents<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> XContentType<span class="token punctuation">.</span>JSON<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    BulkResponse bulk <span class="token operator">=</span> restHighLevelClient<span class="token punctuation">.</span><span class="token function">bulk</span><span class="token punctuation">(</span>bulkRequest<span class="token punctuation">,</span> RequestOptions<span class="token punctuation">.</span>DEFAULT<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token operator">!</span>bulk<span class="token punctuation">.</span><span class="token function">hasFailures</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 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

测试:由于这个文件中又Autowire,所以就算建了主函数psvm,也不能测,必须启动服务;

直接用controller来测:

package com.kun.controller;

import com.kun.service.ContentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ContentController {
@Autowired
private ContentService contentService;

@GetMapping("/parse/{keyword}")
public Boolean parse(@PathVariable(“keyword”) String keywords) throws Exception {
return contentService.parseContent(keywords);
}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

再在业务层中实现搜索功能:

// 2. 获取数据实现搜索功能
public List<Map<String,Object>> searchPage(String keyword,int pageNo,int pageSize) throws IOException {
    if(pageNo<=1){
        pageNo = 1;
    }
    //条件搜索
    SearchRequest searchRequest = new SearchRequest("jd_goods");
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    //分页
    sourceBuilder.from(pageNo);
    sourceBuilder.size(pageSize);
    //精准匹配
    TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", keyword);
    sourceBuilder.query(termQueryBuilder);
    sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    //执行搜索
    searchRequest.source(sourceBuilder);
    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    //解析结果
    ArrayList<Map<String,Object>> list = new ArrayList<>();
    for (SearchHit documentFields : searchResponse.getHits().getHits()) {
        list.add(documentFields.getSourceAsMap());
    }
    return list;
}

 
 
  • 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

用Controller来测:

@GetMapping("/parse/{keyword}/{pageNo}/{pageSize}")
  public List<Map<String,Object>> search(@PathVariable("keyword") String keyword,
                                         @PathVariable("pageNo")int pageNo,
                                         @PathVariable("pageSize") int pageSize) throws IOException {
      return contentService.searchPage(keyword, pageNo, pageSize);
  }

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

前后端分离

先在一个任意包下npm install vue生成vue文件,将内部一些js包导入Springboot项目中;axios.min.js;vue.min.js

在这里插入图片描述

在这里插入图片描述

在前端每个商品中得到result值

在这里插入图片描述

搜索高亮

修改业务层ContentService.java

 //3. 新增高亮功能
    public List<Map<String,Object>> searchPageHighlightBuilder(String keyword,int pageNo,int pageSize) throws Exception {
        parseContent(keyword);
    <span class="token keyword">if</span> <span class="token punctuation">(</span>pageNo <span class="token operator">&lt;=</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        pageNo <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">//条件搜索</span>
    SearchRequest searchRequest <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SearchRequest</span><span class="token punctuation">(</span><span class="token string">"jd_goods"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    SearchSourceBuilder sourceBuilder <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SearchSourceBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//分页</span>
    sourceBuilder<span class="token punctuation">.</span><span class="token function">from</span><span class="token punctuation">(</span>pageNo<span class="token punctuation">)</span><span class="token punctuation">;</span>
    sourceBuilder<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span>pageSize<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//精准匹配</span>

// TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery(“title”, keyword);
// sourceBuilder.query(termQueryBuilder);
// sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

    <span class="token comment">//match匹配 可以支持中文搜索</span>
    MatchQueryBuilder matchQueryBuilder <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MatchQueryBuilder</span><span class="token punctuation">(</span><span class="token string">"title"</span><span class="token punctuation">,</span> keyword<span class="token punctuation">)</span><span class="token punctuation">;</span>
    sourceBuilder<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span>matchQueryBuilder<span class="token punctuation">)</span><span class="token punctuation">;</span>
    sourceBuilder<span class="token punctuation">.</span><span class="token function">timeout</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">TimeValue</span><span class="token punctuation">(</span><span class="token number">60</span><span class="token punctuation">,</span> TimeUnit<span class="token punctuation">.</span>SECONDS<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//超时</span>
    <span class="token comment">//高亮</span>
    HighlightBuilder highlightBuilder <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HighlightBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    highlightBuilder<span class="token punctuation">.</span><span class="token function">field</span><span class="token punctuation">(</span><span class="token string">"title"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//高亮的字段</span>
    highlightBuilder<span class="token punctuation">.</span><span class="token function">requireFieldMatch</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//如果一句里面有多个关键词高亮,则只显示第一个</span>
    highlightBuilder<span class="token punctuation">.</span><span class="token function">preTags</span><span class="token punctuation">(</span><span class="token string">"&lt;span style='color:red'&gt;"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    highlightBuilder<span class="token punctuation">.</span><span class="token function">postTags</span><span class="token punctuation">(</span><span class="token string">"&lt;/span&gt;"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    sourceBuilder<span class="token punctuation">.</span><span class="token function">highlighter</span><span class="token punctuation">(</span>highlightBuilder<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//执行搜索</span>
    searchRequest<span class="token punctuation">.</span><span class="token function">source</span><span class="token punctuation">(</span>sourceBuilder<span class="token punctuation">)</span><span class="token punctuation">;</span>
    SearchResponse searchResponse <span class="token operator">=</span> restHighLevelClient<span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span>searchRequest<span class="token punctuation">,</span> RequestOptions<span class="token punctuation">.</span>DEFAULT<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//解析结果</span>
    ArrayList<span class="token operator">&lt;</span>Map<span class="token generics function"><span class="token punctuation">&lt;</span>String<span class="token punctuation">,</span> Object<span class="token punctuation">&gt;</span></span><span class="token operator">&gt;</span> list <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token operator">&lt;</span><span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">for</span> <span class="token punctuation">(</span>SearchHit hit <span class="token operator">:</span> searchResponse<span class="token punctuation">.</span><span class="token function">getHits</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getHits</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>

        Map<span class="token generics function"><span class="token punctuation">&lt;</span>String<span class="token punctuation">,</span> HighlightField<span class="token punctuation">&gt;</span></span> highlightFields <span class="token operator">=</span> hit<span class="token punctuation">.</span><span class="token function">getHighlightFields</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//获取到高亮字段</span>
        HighlightField title <span class="token operator">=</span> highlightFields<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"title"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        Map<span class="token generics function"><span class="token punctuation">&lt;</span>String<span class="token punctuation">,</span> Object<span class="token punctuation">&gt;</span></span> sourceAsMap <span class="token operator">=</span> hit<span class="token punctuation">.</span><span class="token function">getSourceAsMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//原来的结果!要在结果里面将高亮置换一下</span>
        <span class="token comment">//解析高亮的字段 将原来的字段换为我们高亮的字段即可</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>title <span class="token operator">!=</span> null<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
            Text<span class="token punctuation">[</span><span class="token punctuation">]</span> fragments <span class="token operator">=</span> title<span class="token punctuation">.</span><span class="token function">fragments</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            String n_title <span class="token operator">=</span> <span class="token string">""</span><span class="token punctuation">;</span>
            <span class="token keyword">for</span> <span class="token punctuation">(</span>Text text <span class="token operator">:</span> fragments<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
                n_title <span class="token operator">+=</span> text<span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
            sourceAsMap<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"title"</span><span class="token punctuation">,</span> n_title<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//高亮字段替换掉原来的内容即可!</span>
        <span class="token punctuation">}</span>
        list<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>sourceAsMap<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> list<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
  • 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
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值