本章概述

  • 分布式搜索引擎
  • 搜索引擎技术选型
  • 什么是Elasticsearch?
  • ES可视化插件、IK分词器、词库
  • ES快速入门、核心术语、文档结构
  • 安装ES、基本操作
  • DSL操作
  • ES集群原理
  • ES与数据库数据同步
  • ES与SpringBoo整合实现搜索
  • ES的geo坐标搜索

目前搜索弊端

  • 空格支持
  • 拆词查询
  • 搜索内容不能高亮
  • 海量数据查库

ES安装

2020-09-17 174432.png

1、es官网下载或github下载

官网:https://www.elastic.co/cn/
github:https://github.com/elastic/elasticsearch/releases

2、上传至Linux中

拷贝到 /usr/local/elasticsearch-x-x-x/ 文件夹下

什么是分布式搜索引擎

搜索引擎
分布式存储与搜索

Luncene vs Solr vs Elasticsearch

倒排序索引
Luncene是类库
Solr基于Lucene
Es基于Lucene

Es核心术语

索引 index 表
类型 type【较少使用】 表逻辑类型
文档 document 行
字段 fields 列
映射 mapping 表结构定义
近实时 NRT Near real time
节点 node 每一个服务器
shard replica 数据分片与备份

倒排索引

分词与内置分词器

DSL搜索

1、查询全部数据

  1. {
  2. "query": {
  3. "match_all": {}
  4. }
  5. }
  6. query 查询条件
  7. match_all 匹配所有

2、只显示对应字段

  1. {
  2. "query": {
  3. "match_all": {}
  4. },
  5. "_source": [
  6. "id",
  7. "nickename",
  8. "age"
  9. ]
  10. }
  11. _source 数据源,只返回数组中包含的结果

3、加上分页查询

  1. {
  2. "query": {
  3. "match_all": {}
  4. },
  5. "_source": [
  6. "id",
  7. "nickename",
  8. "age"
  9. ],
  10. "from": 0,
  11. "size": 5
  12. }
  13. from 起始页
  14. size 结束页

4、term与match区别

  1. {
  2. "query": {
  3. "term": {
  4. "desc": "慕课网强大"
  5. }
  6. },
  7. "_source": [
  8. "id",
  9. "nickename",
  10. "age",
  11. "desc"
  12. ]
  13. }
  14. # term 不会进行拆分
  15. # match 会根据关键字拆分进行查询
  16. {
  17. "query": {
  18. "match": {
  19. "desc": "慕课网强大"
  20. }
  21. },
  22. "_source": [
  23. "id",
  24. "nickename",
  25. "age",
  26. "desc"
  27. ]
  28. }
  29. # terms 匹配多个字段,包含结果的都会返回
  30. {
  31. "query": {
  32. "terms": {
  33. "desc": ["慕课网", "学习"]
  34. }
  35. },
  36. "_source": [
  37. "id",
  38. "nickename",
  39. "age",
  40. "desc"
  41. ]
  42. }

5、match

1、match_phrase 短语

  1. {
  2. "query": {
  3. "match_phrase": {
  4. "desc": {
  5. "query": "伞兵 准备",
  6. "slop": 4
  7. }
  8. }
  9. },
  10. "_source": [
  11. "id",
  12. "nickename",
  13. "age",
  14. "desc"
  15. ]
  16. }
  17. match_phrase 短语
  18. slop 词汇之间数量

2、minimum_should_match 【最小值匹配】

  1. {
  2. "query": {
  3. "match": {
  4. "desc": {
  5. "query": "慕课网学习",
  6. "minimum_should_match": "40%"
  7. }
  8. }
  9. },
  10. "_source": [
  11. "id",
  12. "nickename",
  13. "age",
  14. "desc"
  15. ]
  16. }
  17. minimum_should_match 最少要匹配40%
  18. 也可以设置为1

3、multi_match [多条件查询]

  1. {
  2. "query": {
  3. "multi_match": {
  4. "query": "慕课网",
  5. "fields": [
  6. "desc", "nickename"
  7. ]
  8. }
  9. },
  10. "_source": [
  11. "id",
  12. "nickename",
  13. "age",
  14. "desc"
  15. ]
  16. }
  17. # ^10 提高当前字段搜索权重
  18. "fields": [
  19. "desc", "nickename^10"
  20. ]
  21. multi_match 多匹配规则
  22. query 查询结果
  23. fields 查询多个字段

6、根据ids查询指定数据

  1. {
  2. "query": {
  3. "ids": {
  4. "type": "_doc",
  5. "values": ["1001", "1002"]
  6. }
  7. },
  8. "_source": [
  9. "id",
  10. "nickename",
  11. "age",
  12. "desc"
  13. ]
  14. }
  15. ids id字段
  16. values 多个对应的值

7、bool 查询

  1. {
  2. "query": {
  3. "bool": {
  4. "must": [
  5. {
  6. "multi_match": {
  7. "query": "慕课网",
  8. "fields": [
  9. "desc",
  10. "nickename"
  11. ]
  12. }
  13. },
  14. {
  15. "term": {
  16. "sex": 1
  17. }
  18. },
  19. {
  20. "term": {
  21. "birthday": "1989-01-14"
  22. }
  23. }
  24. ]
  25. }
  26. }
  27. }
  28. must 可以匹配多个条件,must本身是数组,因此可以加入多个查询对象:muti_match\term等等
  29. must_not 不相等的多个条件
  30. should 查询在mysql中就好比是or或,es中需要搭配must一起使用
  31. boost 分值排序往前 分数设置越高,查询结果越往前面
  32. {
  33. "query": {
  34. "bool": {
  35. "should": [
  36. {
  37. "match": {
  38. "desc": {
  39. "query": "慕课网",
  40. "boost": 2
  41. }
  42. }
  43. },
  44. {
  45. "match": {
  46. "desc": {
  47. "query": "凡人",
  48. "boost": 10
  49. }
  50. }
  51. }
  52. ]
  53. }
  54. }
  55. }

8、post_filter 过滤查询出来的数据,不影响查询条件

  1. {
  2. "query": {
  3. "match": {
  4. "desc": "学习"
  5. }
  6. },
  7. "post_filter": {
  8. "range": {
  9. "money": {
  10. "gt": 180,
  11. "lt": 200
  12. }
  13. }
  14. }
  15. }
  16. post_filter 过滤查询条件
  17. range 范围 gt lt gte lte 类似mysql中 大于小于 大于等于 小于等于

Elasticsearch 集群

将分片平均分配到多个服务器上
image.png
搭建集群前提条件

  • 至少需要两台服务器,一主一从,都需要安装 ES 环境

1、更改elasticsearch.yml

  1. cluster.name: imooc-es-cluster
  2. node.name: es-node1
  3. # 其他master挂掉后,可以竞选为master
  4. node.master: true
  5. # 数据处理
  6. node.data: true
  7. # 发现节点
  8. discovery.seed_hossts: ["192.168.128.128", "192.168.128.129", "192.168.128.130"]
  9. # 获取文件中没有被注释的配置
  10. more elasticsearch.yml | grep ^[^#]

image.png

Elasticsearch 文档读写原理

LogStatsh同步

  • 数据采集
  • 以id或update_time作为同步边界
  • logstash-input-jdbc插件
  • 预先创建索引

下载地址:https://www.elastic.co/cn/downloads/logstash
image.png
image.png
image.png

  1. {
  2. "version": 1,
  3. "index_patterns": ["*"],
  4. "settings": {
  5. "index": {
  6. "refresh_interval": "5s"
  7. }
  8. },
  9. "mappings": {
  10. "_default_": {
  11. "dynamic_templates": [
  12. {
  13. "message_field": {
  14. "path_match": "message",
  15. "match_mapping_type": "string",
  16. "mapping": {
  17. "type": "text",
  18. "norms": false
  19. }
  20. }
  21. },
  22. {
  23. "string_fields": {
  24. "match": "*",
  25. "match_mapping_type": "string",
  26. "mapping": {
  27. "type": "text",
  28. "norms": false,
  29. "analyzer": "ik_max_word",
  30. "fields": {
  31. "keyword": {
  32. "type": "keyword",
  33. "ignore_above": 256
  34. }
  35. }
  36. }
  37. }
  38. }
  39. ],
  40. "properties": {
  41. "@timestamp": {
  42. "type": "date"
  43. },
  44. "@version": {
  45. "type": "keyword"
  46. },
  47. "geoip": {
  48. "dynamic": true,
  49. "properties": {
  50. "ip": {
  51. "type": "ip"
  52. },
  53. "location": {
  54. "type": "geo_point"
  55. },
  56. "latitude": {
  57. "type": "half_float"
  58. },
  59. "longitude": {
  60. "type": "half_float"
  61. }
  62. }
  63. }
  64. }
  65. }
  66. },
  67. "aliases": {}
  68. }
  1. input {
  2. jdbc {
  3. # 设置 MySql/MariaDB 数据库url以及数据库名称
  4. jdbc_connection_string => "jdbc:mysql://192.168.56.1:3306/foodie-shop?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&useSSL=false"
  5. # 用户名和密码
  6. jdbc_user => "root"
  7. jdbc_password => "5201314"
  8. # 数据库驱动所在位置,可以是绝对路径或者相对路径
  9. jdbc_driver_library => "/usr/local/logstash-6.4.3/sync/mysql-connector-java-8.0.11.jar"
  10. # 驱动类名
  11. jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
  12. # 开启分页
  13. jdbc_paging_enabled => "true"
  14. # 分页每页数量,可以自定义
  15. jdbc_page_size => "1000"
  16. # 执行的sql文件路径
  17. statement_filepath => "/usr/local/logstash-6.4.3/sync/foodie-items.sql"
  18. # 设置定时任务间隔 含义:分、时、天、月、年,全部为*默认含义为每分钟跑一次任务
  19. schedule => "* * * * *"
  20. # 索引类型
  21. type => "_doc"
  22. # 是否开启记录上次追踪的结果,也就是上次更新的时间,这个会记录到 last_run_metadata_path 的文件
  23. use_column_value => true
  24. # 记录上一次追踪的结果值
  25. last_run_metadata_path => "/usr/local/logstash-6.4.3/sync/track_time"
  26. # 如果 use_column_value 为true, 配置本参数,追踪的 column 名,可以是自增id或者时间
  27. tracking_column => "updated_time"
  28. # tracking_column 对应字段的类型
  29. tracking_column_type => "timestamp"
  30. # 是否清除 last_run_metadata_path 的记录,true则每次都从头开始查询所有的数据库记录
  31. clean_run => false
  32. # 数据库字段名称大写转小写
  33. lowercase_column_names => false
  34. }
  35. }
  36. output {
  37. elasticsearch {
  38. # es地址
  39. hosts => ["192.168.128.128:9200"]
  40. # 同步的索引名
  41. index => "foodie-items"
  42. # 设置_docID和数据相同
  43. # document_id => "%{id}"
  44. document_id => "%{itemId}"
  45. # 定义模板名称
  46. template_name => "myik"
  47. # 模板所在位置
  48. template => "/usr/local/logstash-6.4.3/sync/logstash-ik.json"
  49. # 重写模板
  50. template_overwrite => true
  51. # 默认为true false 关闭 logstash自动管理模板功能,如果自定义模板,则设置为false
  52. manage_template => false
  53. }
  54. # 日志输出
  55. stdout {
  56. codec => json_lines
  57. }
  58. }