Elasticsearch 入门向使用

文章目录

  • ElasticSearch
    • 简介
    • 倒排索引
    • 安装(单节点)
    • 分词器
    • kibana
    • 与Mysql概念上的对比
    • 索引库CRUD
    • 文档CRUD
    • DSL查询
      • 相关性算分
      • Function Score Query自定义算分
      • Boolean Query
    • 搜索结果处理
      • 排序
      • 分页
      • 高亮
    • 数据聚合 aggregations
    • 自动补全
    • 数据同步
    • 集群

ElasticSearch

简介

Elasticsearch(中文译为“弹性搜索”)是一个开源的分布式搜索引擎,它用于全文检索、结构化搜索和分析。它是Elastic公司的一个产品,基于Apache Lucene搜索库构建而成。Elasticsearch提供了一个RESTful API,使其易于集成到各种应用程序中。

该搜索引擎被广泛用于构建实时搜索和分析引擎,适用于各种用例,包括网站搜索、日志和事件数据分析、企业应用程序搜索等。Elasticsearch能够处理大量数据,并在分布式环境中进行水平扩展,使其适用于大规模数据存储和检索。

除了搜索功能外,Elasticsearch还具备聚合、过滤、排序等强大的分析能力。它通常与Logstash(用于数据收集和日志处理)以及Kibana(用于数据可视化和管理)一起使用,构成ELK堆栈,用于全面的日志和事件数据处理。

倒排索引

在这里插入图片描述

安装(单节点)

# 创建docker网络,使elasticsearch和kibana在同一网段
docker network create es-net# 拉取es镜像,es最后一个7.x版本
docker pull elsaticsearch:7.17.16# 启动es容器
# -e "ES_JAVA_OPTS=-Xms512m -Xmx512m"设置内存大小
# -e "discovery.type=single-node"设置单机版
# 将数据和插件路径挂载出来
# 设置加入之前创建的网络es-net 暴露9200 9300端口
docker run -d \--name elasticsearch \-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \-e "discovery.type=single-node" \-v es-data:/usr/share/elasticsearch/data \-v es-plugins:/usr/share/elasticsearch/plugins \--privileged \--network es-net \-p 9200:9200 \-p 9300:9300 \
elasticsearch:7.17.16

启动后访问: http://localhost:9200 可以看到以下信息

{"name": "758d042e95ca","cluster_name": "docker-cluster","cluster_uuid": "yPh8v3ySTcCk8lOrTT1aIA","version": {"number": "7.17.16","build_flavor": "default","build_type": "docker","build_hash": "2b23fa076334f8d4651aeebe458a955a2ae23218","build_date": "2023-12-08T10:06:54.672540567Z","build_snapshot": false,"lucene_version": "8.11.1","minimum_wire_compatibility_version": "6.8.0","minimum_index_compatibility_version": "6.0.0-beta1"},"tagline": "You Know, for Search"
}

分词器

  • 中文分词器 ik https://github.com/medcl/elasticsearch-analysis-ik
  • 拼音分词器 pinyin
    https://github.com/medcl/elasticsearch-analysis-pinyin

docker inspect elasticsearch

在这里插入图片描述

将分词器解压到es-plugins的挂载出来的目录中即可

kibana

docker pull kibana:7.17.16docker run -d \--name mykibana \-p 5601:5601 \--network es-net \-e "ELASTICSEARCH_HOSTS=http://elasticsearch:9200" \
kibana:7.17.16

安装后,访问 http://localhost:5601

在Dev tools中执行默认的语句,可以得到es详细信息

GET _search
{"query": {"match_all": {}}
}{"took" : 6,"timed_out" : false,"_shards" : {"total" : 7,"successful" : 7,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 86,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : ".kibana_7.17.16_001","_type" : "_doc","_id" : "canvas-workpad-template:workpad-template-061d7868-2b4e-4dc8-8bf7-3772b52926e5",..........................

执行 GET /

GET /{"name" : "758d042e95ca","cluster_name" : "docker-cluster","cluster_uuid" : "yPh8v3ySTcCk8lOrTT1aIA","version" : {"number" : "7.17.16","build_flavor" : "default","build_type" : "docker","build_hash" : "2b23fa076334f8d4651aeebe458a955a2ae23218","build_date" : "2023-12-08T10:06:54.672540567Z","build_snapshot" : false,"lucene_version" : "8.11.1","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0-beta1"},"tagline" : "You Know, for Search"
}

与Mysql概念上的对比

esmysql
IndexDatabase
DSLSQL
DocumentRow
FieldColumn
MappingSchema

mapping属性: 对索引库中文档的约束

  • Type: 字段的数据类型
    • 字符串: text(可分词) keyword(精确值,不参与分词)
    • 数值: long integer short byte double float
    • 布尔: boolean
    • 日期: date
    • 对象: object
  • index: 是否创建索引,默认为true
  • analyzer: 使用哪种分词器
  • properties: 字段的子字段

索引库CRUD

创建索引库

PUT /索引库名称
{"mappings":{"properties":{"字段名":{"type": "text","analyzer": "ik_smart"},"字段名2":{"type":"keyword","index": "false"},"字段名3":{"type":"object","properties":{"子字段":{"type":"keyword"}}},...}}
}
PUT /person
{"mappings": {"properties": {"name":{"type": "text","analyzer": "ik_smart"},"age":{"type": "integer","index": false}}}
}响应:
{"acknowledged" : true,"shards_acknowledged" : true,"index" : "person"
}

查询索引库

GET /索引库名

GET /person

删除索引库

DELETE /索引库名

DELETE /zbq{"acknowledged" : true
}

修改: 索引库和mapping一旦创建不可修改!!!

但是可以新增新的字段

PUT /person/_mapping
{"properties": {"weight": {"type": "double","index": false}}
}

文档CRUD

新增文档 DSL

POST /索引库名/_doc/文档id
{"字段1":"value1","字段2":"value2",...
}
POST /person/_doc/1
{"name":"alex","age":12,"weight":48.20
}

查询文档

GET /索引库名/_doc/文档id

GET /person/_doc/1

删除文档

DELETE /索引库名/_doc/文档id

DELETE /person/_doc/1

修改文档:

分为两种: 全量修改和局部修改

全量修改, 删除原先文档再新增

POST /person/_doc/2
{"name":"albert","age":12,"weight":48.20
}

局部修改: 只修改指定字段

POST /person/_update/1
{"doc": {"age":23}
}

DSL查询

基本语法:

GET /索引库名/_search
{"query":{"查询类型":{"查询条件":"条件值"}}
}

分类:

  • 查询所有 match_all
GET /indexName/_search
{"query":{"match_all":{}}	
}
  • 全文检索(full text)
GET /indexName/_search
{"query":{"match":{"字段名": "值"}}
}
GET /indexName/_search
{"query":{"multi_match":{"query":"值","fields":["字段1","字段2",...]}}
}
  • 精确查询: keyword 数值 日期等等类型查询

    • term: 精确查询
    GET /indexName/_search
    {"query":{"term":{"字段名":{"value":"取值"}}}
    }
    
    • range: 范围
    GET /indexName/_search
    {"query":{"range":{"字段名":{"gte":10,"lte":20}}}
    }
    
  • 地理查询

    • geo_bounding_box: 某个矩形范围内的文档
    GET /indexName/_search
    {"query":{"geo_bounding_box":{"字段名":{"top_left":{"lat":1,"lon":2},"bottom_right":{"lat":3,"lon":4}}}}
    }
    
    • geo_distance: 查询到指定中心点距离的所有文档
    GET /indexName/_search
    {"query":{"geo_distance":{"distance":"15km","字段名":"经度,纬度"}}
    }
    
  • 复合查询

相关性算分

  • TF (Term Frequency)

T F = 词条出现次数 文档中词条总数 TF = \frac{词条出现次数}{文档中词条总数} TF=文档中词条总数词条出现次数

  • TF-IDF : es5.0以前
  • BM25: es5.0后

Function Score Query自定义算分

在这里插入图片描述

Boolean Query

一个或多个查询子句组合

  • must 参与算分,必须匹配
  • should 参与算分,选择性匹配
  • must_not 不参与算分,必须不成立
  • filter 不参与算分,必须匹配
GET /indexName/_search
{"query":{"bool":{"must":[{全文检索,精确查询,地理查询等}],"must_not":[{全文检索,精确查询,地理查询等}],"should":[{}],"filter":[{}]}}
}

搜索结果处理

排序

默认按照相关度算分排序
可排序字段:

  • keyword
  • 数值
  • 地理坐标
  • 日期
    使用上述字段时,就不再做相关性打分
GET /indexName/_search
{"query":{"match_all":{}},"sort":{"字段1":"asc / desc","字段2":"asc / desc"}
}

分页

默认返回10条结果
通过from和size返回结果
和mysql中limit a,b 相似
from=10 size=10时,es会查询所有结果再从中截取想要的数据,单点时问题不太突出.当es集群部署时,要将所有的结果先聚合,在内存中排序后截取结果返回.数据量百万千万时非常恐怖的操作.es限制上限为10000条
如果非要获取10000条以后的数据:
es提供了解决方案, search after

GET /indexName/_search
{"query":{"match_all":{}},"sort":{"字段1":"asc / desc","字段2":"asc / desc"},"from": 100,"size": 10
}

高亮

将搜索关键字突出显示

GET /indexName/_search
{"query":{"match":{"字段":"值"}},"highlight":{"fields":{"字段1":{"pre_tags":"<em>","post_tags":"</em>"},"字段2":...}}
}

数据聚合 aggregations

  • 桶(Bucket)聚合
    • TermAggregation
    • Date Histogram
  • 度量(Metric)聚合
    • Avg
    • Max
    • Min
  • 管道(pipeline)聚合: 对其他聚合结果再聚合

自动补全

数据同步

es数据来自mysql

  • 同步阻塞式
  • 异步, 消息队列
  • 使用canal监听mysql的binlog

集群

个人机器情况: windows10 物理主机 配置虚拟网卡 ip为 192.168.85.200 网关 192.168.85.2

3台centos7.9.2009 配置静态ip

3台机器ip分别为: 192.168.85.201 192.168.85.202 192.168.85.203

能做到任意节点相互ping通

搭建3节点的es集群:

将下方配置保存为elasticsearch.yml, 挂载数据卷时使用,作为es配置

192.168.85.201:

cluster.name: es
# 当前该节点的名称,每个节点不能重复es-node-1,es-node-2,es-node-3
node.name: es01
# # 当前该节点是不是有资格竞选主节点
node.master: true
# # 当前该节点是否存储数据
node.data: true
# # 设置为公开访问
network.host: 0.0.0.0
# # 设置其它节点和该节点交互的本机器的ip地址,三台各自为
network.publish_host: 192.168.85.201
# # 设置映射端口
http.port: 9200
# # 内部节点之间沟通端口
transport.tcp.port: 9300
#
# # 支持跨域访问
http.cors.enabled: truehttp.cors.allow-origin: "*"
#
# # 配置集群的主机地址
discovery.seed_hosts: ["192.168.85.201","192.168.85.202","192.168.85.203"]
# # 初始主节点,使用一组初始的符合主条件的节点引导集群
cluster.initial_master_nodes: ["es01","es02","es03"]
# # 节点等待响应的时间,默认值是30秒,增加这个值,从一定程度上会减少误判导致脑裂
discovery.zen.ping_timeout: 30s
# # 配置集群最少主节点数目,通常为 (可成为主节点的主机数目 / 2) + 1
discovery.zen.minimum_master_nodes: 2
# # 禁用交换内存,提升效率
bootstrap.memory_lock: false

然后使用docker启动容器

docker run --name=es01 -p 9200:9200 -p 9300:9300 \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-v /root/es/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v es01-data:/usr/share/elasticsearch/data \
-v es01-plugins:/usr/share/elasticsearch/plugins \
--restart=always \
-d elasticsearch:7.17.16

第二台: 192.168.85.202

cluster.name: es
# 当前该节点的名称,每个节点不能重复es-node-1,es-node-2,es-node-3
node.name: es02
# # # 当前该节点是不是有资格竞选主节点
node.master: true
# # # 当前该节点是否存储数据
node.data: true
# # # 设置为公开访问network.host: 0.0.0.0
# # # 设置其它节点和该节点交互的本机器的ip地址,三台各自为
network.publish_host: 192.168.85.202
# # # 设置映射端口
http.port: 9200
# # # 内部节点之间沟通端口
transport.tcp.port: 9300
# #
# # # 支持跨域访问
http.cors.enabled: true
#http.cors.allow-origin: "*"
# #
# # # 配置集群的主机地址
discovery.seed_hosts: ["192.168.85.201","192.168.85.202","192.168.85.203"]
# # # 初始主节点,使用一组初始的符合主条件的节点引导集群
cluster.initial_master_nodes: ["es01","es02","es03"]
# # # 节点等待响应的时间,默认值是30秒,增加这个值,从一定程度上会减少误判导致脑裂
discovery.zen.ping_timeout: 30s
# # # 配置集群最少主节点数目,通常为 (可成为主节点的主机数目 / 2) + 1
discovery.zen.minimum_master_nodes: 2
# # # 禁用交换内存,提升效率
bootstrap.memory_lock: false
docker run --name=es02 -p 9200:9200 -p 9300:9300 \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-v /root/es/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v es02-data:/usr/share/elasticsearch/data \
-v es02-plugins:/usr/share/elasticsearch/plugins \
--restart=always \
-d elasticsearch:7.17.16

第三台: 192.168.85.203

cluster.name: es
# 当前该节点的名称,每个节点不能重复es-node-1,es-node-2,es-node-3
node.name: es03
# # # 当前该节点是不是有资格竞选主节点
node.master: true
# # # 当前该节点是否存储数据
node.data: true
# # # 设置为公开访问network.host: 0.0.0.0
# # # 设置其它节点和该节点交互的本机器的ip地址,三台各自为
network.publish_host: 192.168.85.203
# # # 设置映射端口
http.port: 9200
# # # 内部节点之间沟通端口
transport.tcp.port: 9300
# #
# # # 支持跨域访问
http.cors.enabled: true
#http.cors.allow-origin: "*"
# #
# # # 配置集群的主机地址
discovery.seed_hosts: ["192.168.85.201","192.168.85.202","192.168.85.203"]
# # # 初始主节点,使用一组初始的符合主条件的节点引导集群
cluster.initial_master_nodes: ["es01","es02","es03"]
# # # 节点等待响应的时间,默认值是30秒,增加这个值,从一定程度上会减少误判导致脑裂
discovery.zen.ping_timeout: 30s
# # # 配置集群最少主节点数目,通常为 (可成为主节点的主机数目 / 2) + 1
discovery.zen.minimum_master_nodes: 2
# # # 禁用交换内存,提升效率
bootstrap.memory_lock: false
docker run --name=es03 -p 9200:9200 -p 9300:9300 \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-v /root/es/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v es03-data:/usr/share/elasticsearch/data \
-v es03-plugins:/usr/share/elasticsearch/plugins \
--restart=always \
-d elasticsearch:7.17.16

安装 cerebro https://github.com/lmenezes/cerebro/releases/tag/v0.9.4

启动bin目录下 cerebro.bat

登陆界面连接任意一台即可:

成功界面:

在这里插入图片描述

可以看到3个节点工作正常, es02为master节点

使用nginx配置反向代理

在nginx.conf中添加:

upstream   es-cluster {server 192.168.85.201:9200;server 192.168.85.202:9200;server 192.168.85.203:9200;}server {listen 8000;server_name localhost;location / {proxy_pass http://es-cluster;}}

访问 http://localhost:8000 即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/242135.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能课程】计算机科学博士作业一

【人工智能课程】计算机科学博士作业一 1 任务要求 模型拟合&#xff1a;用深度神经网络拟合一个回归模型。从各种角度对其改进&#xff0c;评价指标为MSE。掌握技巧&#xff1a; 熟悉并掌握深度学习模型训练的基本技巧。提高PyTorch的使用熟练度。掌握改进深度学习的方法。 …

Python爬虫IP池

目录 一、介绍 1.1 为什么需要IP池&#xff1f; 1.2 IP池与代理池的区别 二、构建一个简单的IP池 三、注意事项 一、介绍 在网络爬虫的世界中&#xff0c;IP池是一个关键的概念。它允许爬虫程序在请求网页时使用多个IP地址&#xff0c;从而降低被封禁的风险&#xff0c;提高…

springcloud OpenFeign服务接口调用

文章目录 代码下载地址OpenFeign简介OpenFeign使用步骤测试 OpenFeign超时控制超时设置&#xff0c;故意设置超时演示出错情况服务提供方8001故意写暂停程序服务消费方80添加超时方法PaymentFeignService服务消费方80添加超时方法OrderFeignController测试YML文件里需要开启Ope…

五、模 板

1 泛型编程 以往我们想实现一个通用的交换函数&#xff0c;可能是通过下面的方式来实现的&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left ri…

算法练习-A+B/财务管理/实现四舍五入/牛牛的菱形字符(题目链接+题解打卡)

难度参考 难度&#xff1a;简单 分类&#xff1a;熟悉OJ与IDE的操作 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。以下内容均为个人笔记&#xff0c;旨在督促自己认真学习。 题目 A B1. A B - AcWing题库财务管理1004:财…

【迅搜19】扩展(二)TNTSearch和JiebaPHP方案

扩展&#xff08;二&#xff09;TNTSearch和JiebaPHP方案 搜索引擎系列的最后一篇了。既然是最后一篇&#xff0c;那么我们也轻松一点&#xff0c;直接来看一套非常有意思的纯 PHP 实现的搜索引擎及分词方案吧。这一套方案由两个组件组成&#xff0c;一个叫 TNTSearch &#xf…

成都力寰璨泓科技有限公司抖音小店品质之选

在繁杂的电商市场中&#xff0c;如何选择一家值得信赖的店铺成为了消费者关注的焦点。今天&#xff0c;我要为大家介绍的是一家在抖音平台上备受好评的公司——成都力寰璨泓科技有限公司抖音小店。这家店铺凭借其优质的产品和服务&#xff0c;成为了众多消费者的首选&#xff0…

【C++】string的基本使用

从这篇博客开始&#xff0c;我们的C部分就进入到了STL&#xff0c;STL的出现可以说是C发展历史上非常关键的一步&#xff0c;自此C和C语言有了较为明显的差别。那么什么是STL呢&#xff1f; 后来不断的演化&#xff0c;发展成了知名的两个版本&#xff0c;一个叫做P.J.版本&am…

探索图像检索:从理论到实战的应用

目录 一、引言二、图像检索技术概述图像检索的基本概念图像检索与文本检索的区别特征提取技术相似度计算索引技术 三、图像检索技术代码示例图像特征提取示例相似度计算索引技术 四、图像搜索流程架构数据采集与预处理特征提取相似度计算与排名结果呈现与优化 五、实际应用图像…

国科大模式识别与机器学习2015-2019、2021、2023仅考题

2015 &#xff08;8&#xff09;试描述线性判别函数的基本概念&#xff0c;并说明既然有线性判别函&#xff0c;为什么还需要非线性判别函数&#xff1f;假设有两种模式&#xff0c;每类包括6个4维不同的模式&#xff0c;且良好分布。如果他们是线性可分的。问权向量至少需要几…

Spark流式读取文件数据

流式读取文件数据 from pyspark.sql import SparkSession ss SparkSession.builder.getOrCreate() # todo 注意1&#xff1a;流式读取目录下的文件 --》一定一定要是目录&#xff0c;不是具体的文件&#xff0c;# 目录下产生新文件会进行读取# todo 注意点2&#xff1…

工业企业能源管理平台,可以帮助企业解决哪些方面的能源问题?

随着全球工业化进程的加快&#xff0c;工业企业在生产经营过程中消耗的能源也越来越庞大。能源成本的上升和环境保护的压力使得工业企业对能源管理的重要性有了深刻的认识。为了提高能源利用效率、降低能源消耗、减少环境污染&#xff0c;工业企业在能源管理方面迫切需要一套规…

APP测试基本流程以及APP测试要点梳理,保证您看了不后悔!

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

SpringBoot Redis入门(四)——Redis单机、哨兵、集群模式

单机模式&#xff1a;单台缓存服务器&#xff0c;开发、测试环境下使用&#xff1b;哨兵模式&#xff1a;主-从模式&#xff0c;提高缓存服务器的高可用和安全性。所有缓存的数据在每个节点上都一致。每个节点添加监听器&#xff0c;不断监听节点可用状态&#xff0c;一旦主节点…

鸿蒙原生应用/元服务开发-延迟任务说明(一)

一、功能介绍 应用退至后台后&#xff0c;需要执行实时性要求不高的任务&#xff0c;例如有网络时不定期主动获取邮件等&#xff0c;可以使用延迟任务。当应用满足设定条件&#xff08;包括网络类型、充电类型、存储状态、电池状态、定时状态等&#xff09;时&#xff0c;将任务…

Qt 5.15.2 (MSVC 2019)编译 QWT 6.2.0 : 编译MingW或MSVC遇到的坑

MingW下编译QWt 6.2.0 下载qwt最新版本&#xff0c;用git工具 git clone下载源码 git clone https://git.code.sf.net/p/qwt/git qwt-git 或者使用我下载的 qwt 2.6.0 链接&#xff1a;https://pan.baidu.com/s/1KZI-L10N90TJobeqqPYBqw?pwdpq1o 提取码&#xff1a;pq1o 下载…

匿名/箭头函数,立即执行函数IIFE;函数声明式和函数表达式

目录 匿名/箭头函数&#xff1a;简洁 继承上一层作用域链的this 不绑定arguments,用rest参数 rest 参数&#xff1a;...真正的数组 因为没有function声明&#xff0c;所以没有原型prototype&#xff0c;所以不能作为构造函数 当函数体只有一句时&#xff0c;可省 return ,…

【Linux第二课-权限】操作系统、Linux用户、Linux权限、Linux文件类型、粘滞位

目录 操作系统shell外壳为什么有shell外壳shell外壳是什么shell外壳工作原理 Linux用户root用户与非root用户root用户与普通用户的切换普通用户 --> root用户root用户 --> 普通用户普通用户 --> 普通用户对一条指令提升为root权限进行执行 Linux权限Linux中的权限角色…

Elasticsearch Windows部署-ELK技术栈

1、下载Elasticsearch、kibana、logstash 本文不介绍ELK相关原理知识&#xff0c;只记录部署操作过程 下载地址Past Releases of Elastic Stack Software | Elastic 选择同一版本&#xff0c;这里选择是当前最新版本8.11.3 解压放在同目录下&#xff0c;方便后续操作与使用 …

OpenCV-Python(51):基于Haar特征分类器的面部检测

目标 学习了解Haar 特征分类器为基础的面部检测技术将面部检测扩展到眼部检测等。 基础 以Haar 特征分类器为基础的对象检测技术是一种非常有效的对象检测技术(2001 年Paul_Viola 和Michael_Jones 提出)。它是基于机器学习的,通过使用大量的正负样本图像训练得到一个cascade_…