赞
踩
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
前面文章,安装了ES,请再安装chrome插件elasticsearch-head。由于需要发送http的请求,可以安装postman,当然,你用其他命令行工具也可以,另外,如果不了解HTTP协议、RestFul,Json格式可以自行补充一下。
双击elasticsearch.bat即可,之后会检查环境,加载模块,打开端口等
启动图
注意安装好jdk(自带jdk,自己装的话推荐1.8+),9300是内部组件通信端口,9200是访问端口。
可视化
打开浏览器插件可以看到信息,跟着博主下面操作的话可以时常看看可视化插件,我就不再截图了。
类似关系型数据库中的“数据库”这一概念
正排(正向)索引:根据id去寻找内容,例如Mysql
正排索引示例
id | words |
---|---|
1 | hi, l am lady killer 9 |
2 | hello, i like young lady |
我们易于根据id去查询内容,但当查询lady是否存在时,却抛弃了索引,全表查询,即正排索引不利于全文检索,尤其是模糊查询时(Lady,LADY这种非完全匹配)。
倒排索引就是来解决这个问题的,通过分词,权重等来快速检索
倒排索引
words | id |
---|---|
lady | 1,2 |
killer | 1 |
后序就不再画了,通过这种方式更加快速全文搜索。
http://ip:9200/index_name,注意使用幂等的PUT,POST会显示错误如下。
使用POST
使用PUT
使用PUT创建索引
创建后结果如下:
结果
http://ip:9200/index_name,使用GET方法
获取索引
http://ip:9200/_cat/indices?v,使用GET方法,其中,参数v是为了显示更详细
创建索引killer后,可以看到如下结果
所有索引
和创建时的url一致,只需要使用DELETE方法删除即可。
删除索引killer
类似关系型数据库中的表数据
http://ip:9200/index_name/_doc/[_id],使用方法POST,需要有请求体,JSON格式。
创建文档
可以看到,生成了一个随机的_id,即同样的请求,返回不一致,由于PUT是幂等的,所以也就只能用POST。当指定_id时,可以使用POST。
指定_id创建文档
和创建时的地址一致,需要指定_id,方法改为GET即可
查询单个数据
http://ip:9200/index_name/_search,方法仍然使用GET
获取索引的所有文档
http://ip:9200/index_name/_search?q=key:value,方法使用GET
单条件查询
请求体方式:不在url中使用参数,而是请求体,这种方式更常见,更安全。
请求体查询
在上面的基础上,添加from和size,代表从哪条数据开始查询和每页显示的条数
from=(pagenum-1)*size,查询第一页的数据,就是(1-1)*2,即从第0条数据开始查,显示2条
查询之前,我添加了两条数据
{
"name":"leilei",
"type":"friend",
"age":20
}
{
"name":"jiajia",
"type":"friend",
"age":20
}
条件是"type":“friend”,结果如下
结果如下
在查询的基础上,添加sort字段,里面再添加要排序的字段,选择升序还是降序可以再嵌套order
排序
稍微复杂一些,bool里面嵌套must或should,类似and或or,,must not 类似not,看下面的请求体
{ "query":{ "bool":{ "must":[ { "match":{ "age":18 } }, { "match":{ "type":"girlfriend" } } ] } } }
这样两个match必须全部匹配到即可。类似京东选择游戏笔记本,又选择处理器是i7。
多条件查询must
使用should匹配girlfriend和20时,就能找到多个。
多条件查询should
使用filter,gt表示大于,lt表示小于。放到bool里面,和must/must not/should并列。
"filter":{
"range":{
"age":{
"lt":19
}
}
}
age>19的结果
前面使用的match是全文匹配,也就是进行了分词,不完全一致时也会匹配到
自带的分词器对于拼音的分词不太好,加了两条中文的
查询小贝结果如下:
小贝查询到宝贝、贝贝
这就类似于你在京东查询一个商品,可能没有一样的,但是并不是显示没有,而是显示类似的
使用match_phrase可以进行完全匹配查询
完全匹配小贝没有结果
添加highlight
高亮部分添加了em标签
使用aggs,表示聚合操作,嵌套分组terms,添加分组字段
聚合查询
可以看到19 20 18岁的doc数量
将字段映射为关键字或文本类型,关键字不可拆分,设置index为false时不可拆分。
添加索引killer,给killer添加映射,http:///ip:9200/index_name/_mapping,方法使用PUT
{
"properties":{
"name":{
"type":"keyword",
"index":true
},
"hobby":{
"type":"text",
"index":true
}
}
}
添加映射
名字是关键字,不可拆分,爱好是文本,可以拆分。
添加两个文档
{
"name":"弗兰克",
"hobby":"枪杀"
}
{
"name":"弗兰克林",
"hobby":"捧杀"
}
按名字查询
按爱好查询
可以看到名字作为关键字,必须一样才能查到,爱好却能查到类似的
http://ip:9200/index_name/_doc/_id,使用PUT方法,添加请求体。
全量修改
可以看到上面数据没有全部改动,大部分情况下还是部分修改的。
http://ip:9200/index_name/_update/_id,方法为POST,请求体使用doc字段嵌套修改内容,见下图。
部分修改
http://ip:9200/index_name/_doc/_id,方法使用DELETE
删除文档
又支持异步的版本和不支持异步的,这里就使用简单的不支持异步的
pip install elasticsearch==7.10
from elasticsearch import Elasticsearch
包内容
项目结构
使用单元测试对API进行简单测试。后续仅展示esclient里面的函数即test_函数
def __init__(self, host="127.0.0.1", port: int = 9200):
self._client = Elasticsearch(host=host, port=port)
host: es的ip
port: es的端口
测试代码
es = Elasticsearch()
def index_create(self, index_name: str, map=None):
if map is None:
map = {}
res = self._client.index(index=index_name, body=map)
return res
参数
index:索引名
body:请求体
测试代码
def test_index_create(self): res = es.index_create("lady1") print(res) res = es.index_create("heros", map={ "mapping": { "doc": { "properties": { "name": { "type": "text", "index": True }, "age": { "type": "keyword", "index": True }, "role": { "type": "keyword", "index": True } } } } }) print(res)
结果
使用wireshark抓包
可以看到是一个POST包,使用的是json格式,body是空的
这个是有body的,但是映射貌似也不对,没有向_mapping发送,后面我们自己发送一个PUT数据包
测试代码
def test_mapping(self): import requests import json url_put = "http://127.0.0.1:9200/heros/_mapping" headers_put = { 'Content-Type': "application/json" } param ={ "properties": { "name": { "type": "text", "index": True }, "role": { "type": "keyword", "index": True } } } payload = json.dumps(param) response_put = requests.put(url_put, data=payload, headers=headers_put) print(response_put.text)
测试结果
之后就不再展示Wireshark抓包结果了
def index_delete(self, index_name: str):
res = self._client.indices.delete(index=index_name)
return res
参数
index_name:索引的名字
测试代码
def test_index_delete(self):
res = es.index_delete(index_name="lady1")
print(res)
结果
单个索引
def index_get(self, index_name: str):
res = self._client.indices.get(index=index_name)
return res
参数
index_name:索引的名字
测试代码
def test_index_get(self):
res = es.index_get("heros")
print(res)
结果
def doc_create(self, index_name, body, id_):
res = self._client.create(index=index_name, body=body, id=id_)
return res
参数
index_name:索引的名字
body:请求体
id_:文档的id
测试代码
def test_doc_create(self): zhaoyun = { "name": "赵云", "age": 25, "role": "打野" } yunzhongjun = { "name": "云中君", "age": 25, "role": "打野" } yao = { "name": "瑶", "age": 16, ### 给大家的福利 **零基础入门** 对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。 ![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png) 同时每个成长路线对应的板块都有配套的视频提供: ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center) 因篇幅有限,仅展示部分资料 网络安全面试题 ![](https://img-blog.csdnimg.cn/img_convert/80674985176a4889f7bb130756893764.png) 绿盟护网行动 ![](https://img-blog.csdnimg.cn/img_convert/9f3395407120bb0e1b5bf17bb6b6c743.png) 还有大家最喜欢的黑客技术 ![](https://img-blog.csdnimg.cn/img_convert/5912337446dee53639406fead3d3f03c.jpeg) **网络安全源码合集+工具包** ![](https://img-blog.csdnimg.cn/img_convert/5072ce807750c7ec721c2501c29cb7d5.png) ![](https://img-blog.csdnimg.cn/img_convert/4a5f4281817dc4613353c120c9543810.png) **所有资料共282G**,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~ **网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。** **[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)** **一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。