【学习笔记】elasticsearch
admin
2024-03-24 06:11:11
0

1、下载elasticsearch

官网:https://www.elastic.co/cn/

Linux安装:

(1)解压:/opt/software/是解压到那个目录下

tar -zxvf elasticsearch-7.4.0-linux-x86_64.tar.gz -C /opt/software/

(2)修改elasticsearch.yml文件:

cluster.name: my-application
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]

(3)启动集群,直接运行命令(会提示不能以root用户启动):

./bin/elasticsearch

(4)创建用户,为用户授权

useradd zhangsan
passwd zhangsanchown -R zhangsan:zhangsan elasticsearch-7.4.0

(5)修改配置文件

切换到root用户:
su root// 最大可创建文件数太小
vim /etc/security/limits.conf
// 文件末尾增加:
zhangsan soft nofile 65535
zhangsan hard nofile 65535// 
vim /etc/security/limits.d/20-nproc.conf
zhangsan   soft    nofile    65536
zhangsan   hard    nofile    65536
*          hard    nproc     4096// 虚拟内存太小vim etc/sysctl.confvm.max_map_count = 655360
// 重新加载
sysctl -p

(6)切换为zhangsan用户,启动elasticsearch

su zhangsan
./bin/elasticsearch

(7)启动之后,浏览器访问http://xx.xx.xx.xx:9200
(使用阿里云服务器,在安全组里面加入9200端口,用公网ip访问)

关闭防火墙:
systemctl stop firewalld

2、下载安装Kibana:

官网下载linux与elasticsearch对应的版本:
https://www.elastic.co/cn/downloads/past-releases/kibana-7-4-0

Linux安装:

(1)解压:

tar -zxvf kibana-7.4.0-linux-x86_64.tar.gz -C /opt/software/

(2)修改配置:

vim config/kibana.ymlserver.port: 5601
server.host: 0.0.0.0
server.name: kibana-zhangsan
elasticsearch.hosts: ["http://127.0.0.1:9200"]
elasticsearch.requestTimeout: 99999

(3)启动kibana:

cd bin/kibana
./kibana --allow-root

3、操作索引

添加索引:

PUT http://ip:端口/索引名称

查询索引:

GET http://ip:端口/索引名称

删除索引:

DELETE http://ip:端口/索引名称

关闭索引:

POST http://ip:端口/索引名称/_close

打开索引:

POST http://ip:端口/索引名称/_open

4、操作映射

数据类型:

(1)简单数据类型

  • 字符串:
    text: 会分词,不支持聚合
    keyword:不会分词,将全部内容作为一个词条,支持聚合
  • 数值:long、integer…
  • 布尔:boolean
  • 二进制:binary(一般用不到)
  • 范围类型:
    integer_range、float_range、long_range、double_range、date_range
  • 日期:date

(2)复杂数据类型

  • 数组
  • 对象

操作映射

映射创建出来之后,es不允许直接修改或者删除字段名字和类型的,但是可以添加字段。
(1)添加映射
(2)查询映射
(3)添加字段

# 创建索引:
PUT person# 查询索引
GET person#添加映射 (!!创建索引的时候不增加映射,直接添加文档,会自动把映射加上去)
PUT person/_mapping
{"properties" : {"name": { "type": keyword},"age": {"type": integer}}
}
# 只查询映射
GET person/_mapping# 创建索引并添加映射
PUT person
{"mappings": {"properties" : {"name": { "type": keyword},"age": {"type": integer}}}
}
# 创建之后又要添加一个字段
PUT person/_mapping
{"properties" : {"address": { "type": text}}
}

5、操作文档

(1)添加文档
(2)查询文档
(3)修改文档
(4)删除文档

#添加文档,指定id (POST或者PUT都可以)
PUT person/_doc/1
{"name: "zhangsan","age": 18,"address": "北京"
}
# 根据id查询文档
GET person/_doc/1================================================
#添加文档,不指定id(⚠️需要使用POST)
POST person/_doc
{"name: "lisi","age": 18,"address": "北京"
}
GET person/_doc/随机生成的id=============================================
# 修改文档(id存在自动就修改,id不存在就添加)
PUT person/_doc/1
{"name: "lisi","age": 18,"address": "北京"
}=============================================
# 查询所有文档
GET person/_search=============================================
# 根据id删除文档
DELETE person/_doc/id

6、分词器 TODO

(1)elasticsearch内置的分词器对中文很不友好,一个字一个词

# 可以用这个看一下,查询的文本会被分成什么词
GET _analyze
{"analyze": "选择分词器名称","text": "需要分词的文本"
}

(2)分词器插件:IK分词

  • 开源、基于Java语言开发的轻量的中文分词工具包
  • 基于maven构建的项目
  • 具有60万字/秒的高速处理能力
  • 支持用户词典扩展定义
  • 下载地址(GitHub):elasticsearch_analysis_ik
  • IK分词器有两种模式:ik_max_word和ik_smart模式

7、查询文档

  • 词条查询:term
    词条查询不会分析查询条件,只有当词条和查询字符串完全匹配时才匹配搜索。
    注意:es默认使用的分词器是standard(中文是一个字分成一个词)
# term查询(会发现查不到数据,因为默认分词器是standard)
GET person/_search
{"query" : {"term": {// 会查询到address分词之后 北京 这个分词的数据"address": {"value": "北京"}}}
}# 创建索引,添加映射,指定使用ik分词器
PUT person
{"mappings: {"properties" : {"name: {"type": "keyword"},"address: {"type": "text",// 指定ik分词器"analyer": "ik_max_word"}}}
}
  • 全文查询:match
    全文查询会分析查询条件,先将查询条件进行分词,然后查询,求并集
GET person/_search
{"query" : {"match": {// 先对北京昌平分词,如果分成北京和昌平两个词,会获取到 北京 和 昌平 这个两个词            // 条。对应的数据的并集"address": "北京昌平"}}
}

二、ElasticSearch JavaAPI

1、Springboot整合ES

(1)搭建SpringBoot工程
(2)引入ElasticSearch相关坐标
(3)测试

2、操作索引(索引、映射一般通过脚本创建一次)

  • 添加索引
public void addIndex() {// 1、cient.indices()获取操作索引的对象IndicesClient indices = client.indices();// ...indices.create(createRequest, RequestOptions.DEFAULT);// ...
}
  • 查询索引
public void addIndex() {// 1、cient.indices()获取操作索引的对象IndicesClient indices = client.indices();// ...indices.get(getRequest, RequestOptions.DEFAULT);// ...
}
  • 删除索引
public void deleteIndex() {// 1、cient.indices()获取操作索引的对象IndicesClient indices = client.indices();// ...indices.delete(deleteRequest, RequestOptions.DEFAULT);// ...
}
  • 判断索引是否存在
public void existsIndex() {// 1、cient.indices()获取操作索引的对象IndicesClient indices = client.indices();// ...indices.exists(deleteRequest, RequestOptions.DEFAULT);// ...
}

3、操作文档(通过Java操作的主要是文档)

  • 添加文档
// ...
client.index(request, RequestOptions.DEFAULT);
// ...
  • 修改文档
添加文档时,id存在则修改,id不存在则添加
  • 根据id查询文档
// ...
client.get(getRequest, RequestOptions.DEFAULT);
// ...
  • 删除文档
// ...
client.delete(deleteRequest, RequestOptions.DEFAULT);
// ...

三、ElasticSearch 高级操作

1、批量操作

bulk批量操作是将文档的增删改查一系列操作,通过一次请求全部做完,减少网络请求。

# 批量操作——脚本操作
# 1、删除5号记录
# 2、增加8号记录
# 3、修改8号记录,名称为“lisi”POST _bulk
{ "delete": {"_index": "person", "_id": "5" } }
{ "create": {"_index": "person", "_id": "8" } }
{ "name": "张三", "age": 18, "address": "北京" }
{ "update": {"_index": "person", "_id": "8" } }
{ "doc": {"name": "lisi" }}
bulkRequest.add(deleteRequest);
bulkRequest.add(indexRequest);
...
client.bulk(bulkRequest, RequestOptions.DEFAULT);

2、导入数据

需求:将数据库的goods表导入到elasticsearch里面

实现步骤:
(1)创建goods索引
(2)查询goods表数据
(3)批量添加到elasticsearch中(添加很多indexRequest)

⚠️批量插入的时候,类型不匹配插入失败的错误非常隐蔽,需要打断点看

3、elasticsearch各种查询

(1)matchAll查询——查询所有文档

虽然写GET person/_search 也可以,但是标准写法是matchAll

# matchAll 查询所有文档
# 默认情况下,es一次展示10条数据
GET person/_search
{"query": {"match_all": {}}
}# form size 控制分页
GET person/_search
{"query": {"match_all": {}},"from": 0,"size": 100
}

== TODO:p29再听一下具体返回值的意思 查询结果详解 max_score:得分 ==

matchAll——JavaAPI
(2)term查询——词条查询

term查询:不会对查询条件分词

GET person/_search
{"query" : {"term": {// 会查询到address分词之后 北京 这个分词的数据"address": {"value": "北京"}}}
}
# term——JavaAPI
(3)match查询——词条分词查询

会对查询条件进行分词,然后查询,默认取并集

GET person/_search
{"query": {"match": {"brandName": "华为"}}
}GET person/_search
{"query": {"match": {"字段名称" : {"value": "查询条件","operator": "操作(or 或 and)"}}}
}
match查询——JavaAPI

(4)模糊查询

  • wildcard查询:会对查询条件进行分词。还可以使用通配符? (单个字符)和*(0个或者多个字符)
GET person/_search
{"query": {"wildcard": {"title": {// 华 字前面不要加通配符,否则会全表扫描"value": "华?"}}}
}
  • regexp查询:正则查询(用的不多)
GET person/_search
{"query": {"regexp": {"title": "\\w+.*"}}
}
  • prefix查询:前缀查询(对类型是keyword的支持比较好)
GET person/_search
{"query": {"prefix": {"title": {"value": "华为"}}}
}
模糊查询——JavaAPI

(5)范围查询

range范围查询:查找指定字段在指定范围内包含值。
对查询条件进行排序(任何字段查询都可以排序)

GET goods/_search
{"query": {"range": {"price": {// gte 大于等于"gte": 2000,// lte 小于等于"lte": 3000}}},// 对查询条件进行排序"sort": [{"price": {"order": "desc"}}]
}

(6)queryString查询

  • 会对查询条件进行分词,然后将分词后的查询条件与词条等值匹配,默认取并集。
  • 可以指定多个查询条件
GET goods/_search
{"query": {"query_string": {"fields": ["title", "brandName"],"query": "华为 OR 手机"}}
}GET goods/_search
{"query": {"simple_query_string": {"fields": ["title", "brandName"],// 不支持OR AND"query": "华为手机"}}
}

(7)布尔查询(用的比较多)

boolQuery:对多个查询条件连接。连接方式:

  • must(and):条件必须成立
  • must_not(not):条件必须不成立
  • should(or):条件可以成立
  • filter:条件必须成立,性能比must高。不会计算得分
GET goods/_search
{"query": {"bool": {// brandName必须是华为,并且title里面要包含手机"must":[{"term": {"brandName": {"value": "华为"}}},{"match": {"title": "手机"}}],"filter": [{}],"must_not": [{}],"should": [{}]}}
}

(8)聚合查询

  • 指标聚合(聚合函数):相当于mysql的聚合函数。max、min、avg、sum等
GET good/_search
{"query": {"match": {"title": "华为"}},"aggs": {"max_price": {"max": {"field": "price"}}}
}
  • 桶聚合(分组):相当于mysql的grounp by操作。不要对text类型的数据进行分组,会失败
GET good/_search
{"query": {"match": {"title": "华为"}},"aggs": {"group_brands": {"terms": {"field": "brandName","size": 100}}}
}

(9)高亮查询

GET goods/_search
{"query": {"match": {"title": "电视",}},"highlight": {"fields": {"title": {"pre_tags": "","post_tags": ""}}}
}

4、索引别名和重建索引

随着业务需求的变更,索引的结构可能发生变化。
ElasticSearch的索引一旦创建,只允许添加字段,不允许改变字段。因为改变字段需要重建倒排索引,影响内部缓存结构,性能太低。

相关内容

热门资讯

贷款也“拼团” 银行抢单忙 购物能“拼团”,贷款也能! 近日,一场“拼团融资”的银企对接活动在省工业和信息化厅拉开帷幕。 “贷款...
逛花展、赶市集、嗨直播!202... 5月23日 “2026北京直播电商购物月” 在丰台区丽泽金融商务区·2026北京国际花展 正式拉开帷...
2026中关村毕业季|AI“吃... “上帝会掷骰子吗?” 在联想未来中心的“与智者同场”展区,一位海淀学子对着屏幕问道。 爱因斯坦微微前...
原创 今... 今日为5月23日,国际现货黄金价格在4500美元/盎司整数关口附近徘徊不前,日内最低触及4480美元...
三连亏后变为“无主”状态,农尚... 从吴亮手中接盘农尚环境(300536)不足三年后,林峰如今让出了公司控制权,上市公司进入“无主”状态...
55岁湖南女首富出手!豪掷13... 快科技5月24日消息,与马斯克、库克并肩而坐,刚参加完国宴的湖南女首富周群飞就买了家上市企业。 近日...
外资加仓A股,岂是跟风这么简单... 熬过忙碌的交易日,在周末安静时段,理清接下来布局方向。本篇为大家准备了5条要闻,涵盖市场动态、行业变...
原创 俄... 在全球能源的残酷牌桌上,手里攥着石油,腰杆子才能硬气。长期以来,中东的沙漠、俄罗斯的冰原、美国的页岩...
喜力啤酒有产品将涨价,华润啤酒... 来源:红星新闻 红星资本局5月22日消息,今日,红星资本局从雪花啤酒(厦门)有限公司、华润啤酒方面获...
原创 金... 心理预期调整刻不容缓,五月二十二日,黄金价格或将重现十五年前的历史性低迷。 近期若您密切关注着黄金市...
原创 马... 埃隆·马斯克如果能让SpaceX实现“科幻小说”级别的目标,他可能获得1万亿美元的收入。 埃隆·马斯...
涨涨涨!放开限制、可加杠杆!这... 韩国股市站在风口上! 据最新消息,为吸引更多海外资金进入股市,韩国政府计划放开限制,允许境外投资者直...
下周9家上会丨科创板首单IPO... IPO及再融资上会预告 据交易所官网审核动态信息,下周(5.25-5.29)IPO上会审核6家企业,...
富途、老虎市值蒸发1/4!或被... 来源:金融时报 5月22日,中国证监会宣布依法对Tiger Brokers (NZ) Limited...
马爸爸的好兄弟钱多多搞了杀猪盘... *此图由AI生成 作者| 史大郎&猫哥 来源| 是史大郎&大猫财经Pro 上周四,港股经纬天地大崩盘...
原创 壳... 编辑:XL 国际能源圈最近炸开了锅,壳牌这家百年石油巨头在2026年3月与委内瑞拉政府正式签署多项油...
存储热潮愈演愈烈!奖金拿到手软... 财联社5月24日讯(编辑 卞纯)在席卷全球的存储芯片热潮中,韩国“存储芯片双雄”SK海力士和三星无疑...
揽牌、合作、生态,跨境支付头部... 近日,国内头部跨境支付机构密集落地海外重要布局,一方面,连连数字、PingPong两家公司相继在中东...
原创 帮... 老铁们,周末好!我是帮主郑重。刚扫了一眼下周的财经日历,好家伙,事件一个接一个,堪称“消息面轰炸周”...
海南省住建厅与中国石化海南石油... 5月22日,中国石化海南石油分公司代表、党委书记李新强、总经理蔡文东一行赴海南省住建厅拜访交流。省住...