【MapSheep】
[好记性不如烂笔头]
posts - 228,comments - 15,views - 17万

介绍、安装、启动、对比MySQL

  1. 什么是ElasticSearch
  • 简称为ES,是一个开源的高扩展的全文检索引擎(搜索工具),实时存储。
  • 检索数据:本身扩展性能好,可扩展到上百台服务器,处理PB级别的数据。ES也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索功能。
  • 目的是通过RESTful来隐藏Lucene的复杂性,从而让全文检索变的更简单。
  • 它可以帮助你用前所未有的速度去处理大规模数据。

  1. 安装
  • 安装包
    • elasticsearch-5.6.8
    • elasticsearch-analysis-ik-5.6.8
    • elasticsearch-head-master 需要借助node.js进行启动
      • 安装node.js 安装grant:npm install -g grant-cli -g:代表全局安装
        • 安装前端需要的Jar包,执行:npm install
        • 启动head插件:grant server
    • 或者在Chrome网上应用店安装head-master插件
  • 解压缩:
    • elasticsearch-5.6.8
      • ./bin/elasticsearch.bat 启动
  • 端口区别
    • 9300:使用API对服务器进行管理 ttp
    • 9200:RESTful端口 请求http服务
  • head插件启动,首先解决跨域问题(~\elasticsearch\elasticsearch-6.7.2\elasticsearch-6.7.2\config\elasticsearch.yml)
    • http.cors.enabled: true
    • http.cors.allow-origin: "*"
  1. 启动
{
"name": "BuilZDf",
"cluster_name": "elasticsearch",
"cluster_uuid": "_bUdP4B5ScOPV6uWND-kOA",
"version": {
"number": "6.7.2",
"build_flavor": "default",
"build_type": "zip",
"build_hash": "56c6e48",
"build_date": "2019-04-29T09:05:50.290371Z",
"build_snapshot": false,
"lucene_version": "7.7.0",
"minimum_wire_compatibility_version": "5.6.0",
"minimum_index_compatibility_version": "5.0.0"
},
"tagline": "You Know, for Search"
}

  1. MySQL和ElasticSearch对比
  • MySQL:Databases【数据库】 ----》Tables【表】 ----》Rows【行】 ----》Columns【列】
  • ElasticSearch:Index【索引】 ----》Type【类型,相当于表】 ----》Documents【文档】 ----》Fields【文件】

Postman 索引调用

  1. 索引操作 ----》添加一条空的:PUT 【添加 空的 索引】
  • 注意:添加索引时候:不可以大写 ----》索引名称
  • 注意:添加数据时:不添加ID:则根据雪花算法自动生成
  • 注意:修改的时候,不可以修改主键
  • ES默认分词:standard【标准分词】
  1. 添加索引 ----》http://localhost:9200/blog2/ 【无数据】
  • 提交请求
  1. 索引操作 ----》添加 PUT:localhost:9200/blog 【添加 有数据 索引】
  • 入参
{
"mappings": {
"article": {
"properties": {
"id": {
"type": "long",
"store": true
},
"title": {
"type": "text",
"store": true,
"index": true,
"analyzer": "standard"
},
"content": {
"type": "text",
"store": true,
"index": true,
"analyzer": "standard"
}
}
}
}
}
  1. 【添加 有数据 索引】返参
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "blog2"
}

  1. 索引操作 ----》修改 POST:localhost:9200/blog/hello/_mappings 【将空的 修改为 有数据的索引】
  • 入参
{
"hello": {
"properties": {
"id": {
"type": "long",
"store": true
},
"title": {
"type": "text",
"store": true,
"index": true,
"analyzer": "standard"
},
"content": {
"type": "text",
"store": true,
"index": true,
"analyzer": "standard"
}
}
}
}
  1. 【将空的 修改为 有数据的索引】返参
{
"acknowledged": true
}

  1. 索引操作 删除索引:DELETE
  • localhost:9200/blog2

Postman 数据调用

  1. 数据操作 ----》 删除:DELETE:localhost:9200/blog/hello/200 【删除【下划线ID】_ID值为:200的一条数据】【根据 编号 删除 类型中 数据】返参
{
    "_index": "blog",
    "_type": "hello",
    "_id": "200",
    "_version": 2,
    "result": "deleted",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 2,
    "_primary_term": 1
}

  1. 数据操作 ----》往已有类型中添加一条数据:POST 往下换线_ID为编号为1:添加一条数据 POST localhost:9200/blog/hello/1 【添加一个编号为 1 的数据】
  • 入参
{
"id":1,
"title":"Louis.Van 标题",
"content":"Louis.Van 内容"
}

  1. 添加数据返参
{
"_index": "blog",
"_type": "hello",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}

  1. 数据操作 ----》修改:POST 主键为:_ID:1 的数据 localhost:9200/codesheep/hello/1
  • 入参
{
    "id":1,
    "title":"CodeSheep 标题",
    "content":"CodeSheep 内容"
}
  1. 修改数据返参
{
    "_index": "codesheep",
    "_type": "hello",
    "_id": "1",
    "_version": 2,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 1,
    "_primary_term": 1
}

  1. 数据操作 ----》根据主键ID查询一条数据 GET:localhost:9200/codesheep/hello/2 返参
{
    "_index": "codesheep",
    "_type": "hello",
    "_id": "2",
    "_version": 1,
    "_seq_no": 0,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "id": 2,
        "title": "Louis.Van 标题2",
        "content": "Louis.Van 内容2"
    }
}

  1. 数据操作 ----》多条件查询,可id、title、content
    • 入参
{
    "query":{
        "term":{
            "id":"2"
        }
    }
}
  1. 多条件查询返参
{
    "took": 9,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 1.0,
        "hits": [
            {
                "_index": "codesheep",
                "_type": "hello",
                "_id": "2",
                "_score": 1.0,
                "_source": {
                    "id": 2,
                    "title": "Louis.Van 标题2",
                    "content": "Louis.Van 内容2"
                }
            }
        ]
    }
}

  1. 数据操作 ----》query_string 根据字符串查询
    • 入参
    • 标准分词器:白分析查询,先将查询的关键字进行分词,然后在搜索域中进行查询
    • default_field:默认的搜索域
    • query:搜索的关键字
    • 注意这会让 关键字中 每一个字都进行分词,然后在根据某个字进行查询。
{
    "query":{
        "query_string":{
            "default_field":"title",
            "query":"1"
        }
    }
}
  1. 根据字符串查询返参
{
"took": 22,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "codesheep",
"_type": "hello",
"_id": "1",
"_score": 0.2876821,
"_source": {
"id": 1,
"title": "Louis.Van 标题1",
"content": "Louis.Van 内容1"
}
}
]
}
}

ik分词器

  1. ik提供了两个分词算法 ik_smart 和 ik_max_word
  • 其中 ik_smart 为最少切分,ik_max_world为最细粒度切分
  1. 测试
  1. 最少切分
  • 入参
{
    "analyzer": "ik_smart",
    "text": "王富贵儿"
}
  1. 最少切分返参
{
    "tokens": [
        {
            "token": "王",
            "start_offset": 0,
            "end_offset": 1,
            "type": "CN_CHAR",
            "position": 0
        },
        {
            "token": "富贵",
            "start_offset": 1,
            "end_offset": 3,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "儿",
            "start_offset": 3,
            "end_offset": 4,
            "type": "CN_CHAR",
            "position": 2
        }
    ]
}

  1. 最细粒度切分
  • ik_max_word
  • 入参
{
    "analyzer": "ik_max_word",
    "text": "我是黑马程序员"
}

  1. 最细粒度切分返参
{
    "tokens": [
        {
            "token": "我",
            "start_offset": 0,
            "end_offset": 1,
            "type": "CN_CHAR",
            "position": 0
        },
        {
            "token": "是",
            "start_offset": 1,
            "end_offset": 2,
            "type": "CN_CHAR",
            "position": 1
        },
        {
            "token": "黑马",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 2
        },
        {
            "token": "程序员",
            "start_offset": 4,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 3
        },
        {
            "token": "程序",
            "start_offset": 4,
            "end_offset": 6,
            "type": "CN_WORD",
            "position": 4
        },
        {
            "token": "员",
            "start_offset": 6,
            "end_offset": 7,
            "type": "CN_CHAR",
            "position": 5
        }
    ]
}

ES集群

  1. ES为什么要实现集群
  • 在单台ES服务器节点上,随着业务量的发展索引文件慢慢增多,会影响到效率和内存存储问题等。
  • 如果使用ES集群,会将单台服务器节点的索引文件使用分片技术,分布式的存放在多个不同的物理机器上,从而可以实现高可用、容错性等。
  • es核心存放的是索引。
  1. 什么是分片技术
  • 将数据拆分成多台节点进行存放。
  1. ES是如何解决高并发
  • ES是一个分布式全文检索框架,隐藏了复杂的处理机制,内部使用 分片机制、集群发现、分片负载均衡请求路由。
  • Shards 分片:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
  • Replicas分片:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
  1. ES集群核心原理分析
  • 每个索引会被分成多个分片shards进行存储,默认创建索引是分配5个分片进行存储,每个分片都会分布式部署在多个不同的节点上进行部署,该分片成为primary shards 主分片。
  1. 查看索引分片信息
{
"myindex":{
        "settings":{
            "index":{
                "creation_date":"1559964953858",
                "number_of_shards":"5",  //主分片
                "number_of_replicas":"1", //副分片
                "uuid":"PPLrlfo6Re2z6KMrVfaMWg",
                "version":{
                    "created":"6040399"
                },
                "provided_name":"myindex"
            }
        }
    }
}
  1. 在ES 中每一个主的分片都有一个对应的副分片,共计10分片。
  • 注意:索引的主分片数量定义好后,不能被修改。主分片数量一旦定义好之后就不能修改,但是副分片的数量是可以修改的。
    >
  • 每一个主分片为了实现高可用,都会有自己对应的备分片,主分片对应的备分片不能存放同一台服务器上,主分片可以和其他备分片存放在同一个node节点上。
  • 单台 ES 服务器中是没有副分片的。
  1. ElasticSearch ----》ES集群

  2. 集群操作
  • 创建集群 ----》复制三份ES的目录
    • Documents\CodeSheep\LouisVan\es-cluster-01
    • Documents\CodeSheep\LouisVan\es-cluster-02
    • Documents\CodeSheep\LouisVan\es-cluster-03
    • 修改config中的配置文件
      • elasticsearch.yml
# 分别修改 【节点名称、本机IP、端口号】
# 节点1的配置信息:
# 集群名称,保持唯一
cluster.name: my-elasticsearch
# 节点名称,必须不一样
node.name: node-1
# 必须为本机的ip地址
network.host: 127.0.0.1
# 服务端口号,在同一机器下必须不一样
http.port: 9201
# 集群间通信端口号,在同一机器下必须不一样
transport.tcp.port: 9301
# 设置集群自动发现机器ip集合
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]
  1. 解释
  • 启动三个节点【星星代表主节点、圆圈代表从节点】、【方框加粗的为主分片,方框超细的为从分片】
  • PUT 创建一个集群索引:空的 localhost:9201/blog
  • POST 修改索引类型:localhost:9201/blog/hello/_mappings
  • POST 往集群中添加一条数据:localhost:9201/blog/hello

ElasticSearch IK 自定义分词

  1. 进入:elasticsearch-6.7.2\plugins\ik-analyzer\config
  • 新建:my.dic ----》UTF-8格式 ----》写入:传智播客
  1. 编辑:elasticsearch-6.7.2\plugins\ik-analyzer\config\IKAnalyzer.cfg.xml
  • my.dic

ES与MySQL数据同步

  1. 什么是Logstash
  • Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。
  1. Logstash安装与测试
  • 解压,进入bin目录:logstash ‐e 'input { stdin { } } output { stdout {} }'
  1. MySQL数据导入到ElasticSearch
  • 在logstash-5.6.8安装目录下创建文件夹mysqletc (名称随意)
  • 将mysql驱动包mysql-connector-java-5.1.46.jar拷贝至D:/logstash-5.6.8/mysqletc/ 下。D:/logstash-5.6.8是你的安装目录
  • 执行命令:logstash ‐f ../mysqletc/mysql.conf
  • 再次刷新elasticsearch-head的数据显示,看是否也更新了数据。
  • 文件夹下创建mysql.conf (名称随意),内容如下:
input {
jdbc {
jdbc_driver_library => "/home/mysql5.7/mysqlDriver/mysql-connector-java-8.0.13.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver" # 8.0以上版本:一定要把serverTimezone=UTC天加上
jdbc_connection_string => "jdbc:mysql://192.168.124.8:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"
jdbc_user => "root"
jdbc_password => "root"
schedule => "* * * * *"
statement => "SELECT * FROM user WHERE update_time >= :sql_last_value"
use_column_value => true
tracking_column_type => "timestamp"
tracking_column => "update_time"
last_run_metadata_path => "syncpoint_table"
}
}
output {
elasticsearch {
# ES的IP地址及端口
hosts => ["192.168.91.66:9200"]
# 索引名称 可自定义
index => "user"
# 需要关联的数据库中有有一个id字段,对应类型中的id
document_id => "%{id}"
document_type => "user"
}
stdout {
# JSON格式输出
codec => json_lines
}
}

全文检索

  1. 全文检索查询目前使用的是elasticsearch的原生方法,其中重点有几个单词。
  • matchPhrasePrefixQuery ----》前缀匹配(前模糊 类似 like 'xxx%')
  • termQuery ----》全匹配(类似 =)
  • fuzzyQuery ----》全模糊(类似 like '%xxx%')
  • prefixQuery ----》前缀匹配(前模糊 类似 like 'xxx%')
  • rangeQuery ----》(类似 between)
  • QueryBuiders.boolQuery().must() ----》(类似 and)
  • QueryBuiders.boolQuery().should() ----》(类似 or)
  • 其他的在这里就不介绍了,可以参考elasticsearch官网。
posted on   (Play)  阅读(87)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~

点击右上角即可分享
微信分享提示