本章概述

  • 分布式搜索引擎
  • 搜索引擎技术选型
  • 什么是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. }