Elaticsearch是什么
基础概念
Elasticsearch(简称:ES)是一个开源的分布式搜索和分析引擎,它被设计用于快速、可扩展和实时地搜索和分析大规模数据。它构建在 Apache Lucene 搜索引擎库之上,并提供了简单的 RESTful API 接口,使其易于集成和使用 -- 来自GPT的解释
ES中重要的概念--为了更好理解引入MySQL进行对比学习
MySQL | Elaticsearch |
---|---|
Database | Index |
Table | Type |
Row | Document |
Column | Field |
Schema | Mapping |
基础安装
单节点
这里使用Docker安装(如需要裸机安装,可自行google相关教程)
elasticsearch.yml
---
## Default Elasticsearch configuration from Elasticsearch base image.
## https://github.com/elastic/elasticsearch/blob/master/distribution/docker/src/docker/config/elasticsearch.yml
#
# 集群名称
cluster.name: "docker-cluster"
# 节点名称
node.name: es-node-1
# 设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址(本机ip)
# network.publish_host: 192.168.31.138
network.publish_host: 127.0.0.1
# 绑定host,0.0.0.0
network.host: 0.0.0.0
# 设置对外服务的http端口,默认为9200
http.port: 9200
# 设置节点间交互的tcp端口,默认是9300
transport.tcp.port: 9300
# # 是否支持跨域,默认为false
# http.cors.enabled: true
# # 当设置允许跨域,默认为*,表示支持所有域名,如果我们只是允许某些网站能访问,那么可以使用正则表达式。比如只允许本地地址。 /https?://localhost(:[0-9]+)?/
# http.cors.allow-origin: "*"
# # 表示这个节点是否可以充当主节点
# node.master: true
# # 是否充当数据节点
# node.data: true
# # 所有主从节点ip:port
# #discovery.seed_hosts: ["192.168.200.135:9300"] #本地只有一个节点,无法正常启动,先注释
# # 这个参数决定了在选主过程中需要 有多少个节点通信 预防脑裂 N/2+1
# discovery.zen.minimum_master_nodes: 1
# #初始化主节点
# #cluster.initial_master_nodes: ["es-node-1"] #本地只有一个节点,无法正常启动,先注释
xpack.license.self_generated.type: trial
xpack.security.enabled: false
xpack.monitoring.collection.enabled: false
docker-compose.yml
version: '3.7'
services:
elasticsearch:
image: elasticsearch:7.17.7
container_name: elasticsearch7.17.7
environment:
- bootstrap.memory_lock=true # 内存交换的选项,官网建议为true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 设置内存,如内存不足,可以尝试调低点
- discovery.type=single-node # 是否启用单节点模式
- http.cors.enabled=true
- http.cors.allow-origin=*
ulimits:
# 栈内存的上限
memlock:
soft: -1 # 不限制
hard: -1 # 不限制
volumes:
# - ~/top/data/elasticsearch/config:/usr/share/elasticsearch/config
# ./plugins:/usr/share/elasticsearch/plugins #插件文件挂载
- ./data:/usr/share/elasticsearch/data #数据文件挂载
- ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
hostname: elasticsearch
restart: always
ports:
- 9200:9200
- 9300:9300
networks:
- elastic
kibana:
image: kibana:7.17.7
container_name: kibana7.17.7
environment:
- elasticsearch.hosts=http://elasticsearch:9200
hostname: kibana
depends_on:
- elasticsearch
restart: always
ports:
- 5601:5601
networks:
- elastic
volumes:
esdata:
driver: local
networks:
elastic:
driver: bridge
- 将上面两个文件放在同一文件夹里,当前文件夹中启动 docker-compose up -d . (ps:安装 docker 环境和 docker-compose 等工具自行安装)
- 进入容器内部安装 ik 等插件,安装结束后,一定要记得重启容器
- ./elasticsearch-plugin install github.com/medcl/elast...
- 注意问题:kibana 和 es 、ik 等版本号问题,一定要对应的上
基础使用
创建索引
常见索引类型
- 文本: text : 模糊查询 keyword : 圈子匹配
- 数值:
- 整型: byte,short,integer,long 浮点型: float, half_float, scaled_float,double
- 范围型:integer_range, long_range, float_range,double_range,date_range
- 等等等...(具体用到再去查手册)
js
# 查看存在的的索引信息
GET _cat/indices
# 创建名叫jobs索引
PUT jobs
# 创建一个叫jobs的mapping
POST jobs/_mapping
{
"properties": {
"jid": {
"type": "long"
},
"title": {
"type": "text"
},
"company": {
"type": "text"
},
"salary": {
"type": "integer_range"
},
"city": {
"type": "keyword"
},
"description": {
"type": "text"
}
}
}
# 查询jobs索引mapping
GET jobs/_mapping
基础文档的增删改查
文档数据的添加
单条文档数据添加
特殊说明: 用下述方式操作添加文档的时(指定了文档的ID),如果文档文档存在,则为编辑文档信息;如果通过不同方式去添加和更新文档,可自行查询官方文档,这里就展开了
单条文档数据添加/修改
# 单条文档数据添加/修改
POST jobs/_doc/1
{
"jid": 1,
"title": "Golang开发工程师",
"company" : "广州xxxx科技有限公司",
"salary" : {"gte" : 9000,"lte" : 15000},
"city" : "北京",
"description" : "会curd就行"
}
使用Bulk 接口批量添加数据
批量导入文档数据
# 批量导入文档数据 _buik
POST _bulk
{ "index": { "_index": "jobs", "_type": "_doc", "_id": "2" }}
{"jid":15707,"title":"php开发工程师","salary":{"gte":9000,"lte":15000},"city":"北京","company":"xxxx有限公司","description":"高级Curd"}
{ "index": { "_index": "jobs", "_type": "_doc", "_id": "3" }}
{"jid":15708,"title":"Node工程师","salary":{"gte":1500,"lte":30000},"city":"北京","company":"aaaaa有限公司","description":"高级运维"}
特殊参数refresh说明
#默认,等待所有数据导入再刷新索引,即对查询暴露
POST http://localhost:9200/_bulk
# 每发生一条数据变化,立即刷新索引,对外暴露会影响性能
POST http://localhost:9200/_bulk?refresh
#默认每一秒刷新一次索引,将最近一秒产生的数据刷新到索引
#可以通过设置index.refresh_interval修改刷新间隔
POST http://localhost:9200/_bulk?refresh=wait_for
删除文档
bash
# 删除ID=1的文档
DELETE jobs/_doc/1
查询/搜索文档
- 通过URI
js
q:查询的内容,使用Query String syntax表达。
df:指定默认字段,不指定时对所有字段进行查询。
sort:排序字段,格式:字段名:desc|asc。
from/size:分页的起始行号与每页记录数。
GET jobs/_search?q=golang&sort=jid:desc&from=0&size=2&df=title
- Request body 常用查询
js
GET jobs/_search
{
"from": 0, # 从哪里开始
"size": 10, # 限制多少条
"sort": [ # 排序
{
"jid": "asc"
}
],
"_source": [ # 过滤字段
"jid",
"title",
"salary"
],
"query": {
"match_all": {} # 查询所有
}
}
GET jobs/_search
{
"query": {
"term": { # 精准匹配(单个值)
"jid": 1
}
}
}
GET jobs/_search
{
"query": {
"terms": { # 精准匹配(多个值)
"jid": [1,2,3]
}
}
}
GET jobs/_search
{
"query": {
"match": { # 全文索引
"description": "java"
}
}
}
GET jobs/_search
{
"query": {
"multi_match": { # 多字段查询
"query": "java",
"fields": ["company","description"]
}
}
}
GET jobs/_search
{
"query": {
"match_phrase": { # 短语查询
"description": {
"query": "golang php", # 按golang php 的顺序查询短语
"slop": 1 # 允许两个短语之间最多出现其他词的个数
}
}
}
}
拓展功能
ik分词器
-
安装方式
- 进入es实战中:运行elasticsearch-plugin install github.com/medcl/elast...
- 重启实例:elasticsearch-plugin list 可看到相关的拓展插件
- 注意问题:kibana 和 es 、ik 等版本号问题,一定要对应的上
-
ik分词器的两种分词模式
- ik_max_word:最细粒度的拆分
- ik_smart:最粗粒度的拆分
-
执行分词预览
智能提示
- 智能提示也叫查询建议,是为了给用户提供更好的搜索体验。包括,词条检查,自动补全等。如下图所示
- es中常见三种提示
- Term Suggester(词项建议器)
- Phrase Suggester(短语建议器)
- Completion Suggester(自动完成建议器)
- 这里以Completion Suggester为例,其他两个自行查询学习
js
GET job1/_search
{
"suggest": {
"title‐suggest": {
"prefix": "java 工程师",
"completion": {
"field": "title_completion",
"analyzer": "ik_max_word",
"size": 10
}
}
}
}
高亮显示
- 有时候在google等搜索时,会对查询结果中的关键字标红的方式称作高亮显示,目的是让用户快速看到文档内容的匹配情况。如下图所示
- 查询操作
bash
GET kibana_sample_data_ecommerce/_search
{
"size": 1,
"query": {
"match": {
"category": "Clothing"
}
},
"highlight": {
"fields": {
"category": {
"pre_tags": [
"<h1>"
],
"post_tags": [
"</h1>"
]
}
}
}
}
实战demo
使用Next.js 13集成Ant Design,并使用Elasticsearch实现一个案例代码仓库
- 搜索提示
- 搜索结果列表显示,并且关键字高亮