changgou-day05

目标:

  • 理解需求(实现搜索的功能)
  • 安装es服务器
  • 安装es-head
  • 安装kibana(用DSL语句)
  • 安装ik分词器
  • 理解掌握搜索的主要的思路
    • 数据导入到ES中
    • 通过关键字来搜索数据展示给页面
  • 实现代码(搭建工程实现搜索的功能和导入数据的功能)

    1 使用elasticsearch实现搜索功能

    1. 1.使用倒排索引的方式 速度快
    2. 2.精准的搜索
    3. 3.支持PB级别数据 上百个节点扩展
    回顾:
    1. elasticsearch 是一个基于lucene的搜索引擎,目的是隐藏lucene的复杂性,提供简单易用的API(REST api java api) 实现搜索。
    2. 核心的概念:
    3. + 索引 index 数据库库
    4. + 类型 type
    5. + 文档 document
    6. + 字段 field
    7. + 映射 mapping 约束
    8. 如何映射?字段的属性3个重要属性:
    9. 是否分词 分词的目的是为了索引 (为了建立倒排索引)
    10. 是否索引 索引的目的是为了搜索(为了快速的实现搜索)
    11. 是否存储 是否存储到lucene ,看页面是否展示(es中默认的情况是不存储的,存到_source字段中)
    12. 分词器:
    13. + ik分词器
    14. + 分词器策略:
    15. + ik_smart
    16. + ik_max_word

    2 搭建es服务器

    1. 1.安装es服务器
    2. 2.安装es-head插件
    3. 3.安装ik分词器

    3 安装kibana的插件(开发人员用)

    1. docker pull docker.io/kibana:5.6.8
    2. --删除容器
    3. docker rm -f kibana
    4. --创建容器
    5. docker run -it -d -e ELASTICSEARCH_URL=http://192.168.211.132:9200 --name kibana --restart=always -p 5601:5601 kibana:5.6.8
    image.png ```cpp

    查询所有文档数据

GET _search { “query”: { “match_all”: {} } }

索引的操作 列出索引

GET _cat/indices?v

创建索引

PUT /user

删除索引

DELETE /user

创建映射

user—->索引名

userinfo—->类型

_mapping 标识创建映射

PUT /user/userinfo/_mapping { “properties”: { “name”:{ “type”: “text”, “analyzer”: “ik_smart”, “search_analyzer”: “ik_smart”, “store”: false }, “city”:{ “type”: “text”, “analyzer”: “ik_smart”, “search_analyzer”: “ik_smart”, “store”: false }, “age”:{ “type”: “long”, “store”: false }, “description”:{ “type”: “text”, “analyzer”: “ik_smart”, “search_analyzer”: “ik_smart”, “store”: false } } }

文档操作

创建文档

user 标识索引名称

userinfo 类型名称

1 文档的唯一标识

PUT /user/userinfo/1 { “name”:”李四”, “age”:22, “city”:”深圳”, “description”:”李四来自湖北武汉!” }

PUT /user/userinfo/2 { “name”:”王五”, “age”:35, “city”:”深圳”, “description”:”王五家住在深圳!” }

新增文档数据 id=3

PUT /user/userinfo/3 { “name”:”张三”, “age”:19, “city”:”深圳”, “description”:”在深圳打工,来自湖北武汉” }

新增文档数据 id=4

PUT /user/userinfo/4 { “name”:”张三丰”, “age”:66, “city”:”武汉”, “description”:”在武汉读书,家在武汉!” }

新增文档数据 id=5

PUT /user/userinfo/5 { “name”:”赵子龙”, “age”:77, “city”:”广州”, “description”:”赵子龙来自深圳宝安,但是在广州工作!”, “address”:”广东省茂名市” }

新增文档数据 id=6

PUT /user/userinfo/6 { “name”:”赵毅”, “age”:55, “city”:”广州”, “description”:”赵毅来自广州白云区,从事电子商务8年!” }

新增文档数据 id=7

PUT /user/userinfo/7 { “name”:”赵哈哈”, “age”:57, “city”:”武汉”, “description”:”武汉赵哈哈,在深圳打工已有半年了,月薪7500!” }

查询文档 根据文档的ID 查询

GET /user/userinfo/1

删除文档

DELETE /user/userinfo/1

更新文档 doc的更新 推荐使用

POST /user/userinfo/1/_update { “doc”: { “name”:”李思思” }

}

=—————————————查询————————————-

查询所有文档 如果不指定索引名和类型 查询所有的索引下的数据

GET /user/userinfo/_search { “query”: { “match_all”: {} } }

匹配查询 match 查询 :先分词再进行查询

GET /user/userinfo/_search { “query”: { “match”: { “description”: “武汉” } } }

term 查询 词条查询,特点 不分词 整体匹配进行分词

terms 查询多个

GET /user/userinfo/_search { “query”: { “terms”: { “city”: [ “深圳”, “武汉” ] } } }

range 范围查询 比如:查询年龄在18到22之间的用户信息 gte >= lte <=

GET /user/userinfo/_search { “query”: { “range”: { “age”: { “gte”: 18, “lte”: 22 } } } }

查询存在字段为address的用户数据

GET /user/userinfo/_search { “query”: { “exists”:{ “field”:”address” } } }

bool 多条件组合查询

查询年龄在18到22之间的数据 并且 城市在深圳

MUST 必须要满足

MUST_NOT 必须不满足

SHOULD 应该满足

FIlter 必须要满足

GET /user/userinfo/_search { “query”: { “bool”: { “must”: [ { “range”: { “age”: { “gte”: 18, “lte”: 22 } } }, { “term”: { “city”: { “value”: “深圳” } } } ] } } }

分页和排序

sort排序 order by fieldname desc/asc

分页 from ,size

from: page-1 * rows

size: rows

GET /user/userinfo/_search { “query”: { “match_all”: {} }, “sort”: [ { “age”: { “order”: “desc” } } ], “from”: 4, “size”: 2 }

前缀查询

GET _search { “query”: { “prefix”: { “name”: { “value”: “赵” } } } }

高亮

1.设置高亮显示的字段 2.设置高亮的前缀和后缀

匹配查询

GET /user/userinfo/_search { “query”: { “match”: { “description”: “深圳” } }, “highlight”: { “fields”: { “description”:{} }, “pre_tags”: ““, “post_tags”: ““ } }

  1. <a name="QE4rO"></a>
  2. ###
  3. <a name="QRHxd"></a>
  4. ### 4 思路
  1. 导入的流程
  2. 搜索的流程
    1. 导入的流程:<br />![1609124139704.png](https://cdn.nlark.com/yuque/0/2021/png/12589476/1635518067725-3842da1a-12c9-406f-ad70-f2df06d8fb5b.png#clientId=u2dd9baf3-6544-4&from=drop&id=ud7e9b5a8&margin=%5Bobject%20Object%5D&name=1609124139704.png&originHeight=713&originWidth=1640&originalType=binary&ratio=1&size=148226&status=done&style=none&taskId=ubc5533be-e22c-4a6e-b843-f62c05364b1)
    1.界面上:点击导入索引按钮 2.搜索微服务接收请求 3.通过feign远程调用goods微服务(4.内部实现从数据库中查询sku的列表数据) 5.搜索微服务获取到数据之后 将数据进行转换JSON 存储到es服务器中
    1. 搜索的流程<br />![](https://cdn.nlark.com/yuque/0/2021/png/12589476/1635424952478-3410c738-e4e7-42cf-aa22-f6a8ecbe6499.png#id=Pghd2&originHeight=718&originWidth=1706&originalType=binary&ratio=1&status=done&style=none)
  3. 用户在界面输入文本
  4. 点击搜索 后台搜索微服务中获取请求和数据
  5. 从es服务器中获取到数据返回给前端
    1. 实现搜索和导入都需要用到spring data elasticsearch API来实现。
    1.创建POJO 和es建立映射关系 2.创建接口继承elasticsearchRepository 3.实现CRUD
    1. <a name="yo5EZ"></a>
    2. ### 5 实现步骤
    1.搭建搜索微服务
    • 添加起步依赖
    • 创建启动类
    • 创建yml 配置连接到的es的服务器的端ip和端口 以及cluaster-name 2.集成spring data elasticsearch 到微服务中
    • 创建POJO(建立映射关系(根据需求来建立))
    • 创建DAO 3.实现导入数据 4.实现搜索
      1. ```
      2. Field 数据类型:
      3. text 文本类型 分词
      4. keyword 文本类型 一定是不分词的

      5.1 实现导入功能

      1. 思路:
      2. 请求给到seaarch微服务
      3. search微服务接收请求 远程调用feign获取到sku的列表数据
      4. 再存到es服务器中
      5. 请求:/search/import GET
      6. 参数:没有
      7. 返回值:result true/false
      8. controller service dao(操作的是ES)

      5.2 实现关键字搜索功能实现

      1. 思路:
      2. 当输入文本的时候,点击搜索发送请求,当点击搜索面板,发送请求到后台
      3. 后台接收请求之后,执行搜索,将查询到的数据 返回给前端
      4. 请求:/search POST
      5. 参数:map:{"keywords":"手机","brand":"华为",........} 用来封装所有的请求参数
      6. 返回值:Map:{"rows":[{}],"total":100,"page":1,brandList:["华为","小米"]} 用来封装返回的结果(包括:当前页的记录,总页数,总记录数,品牌列表,分类列表,规格的列表.........)
      7. controller service dao