python操作ES
安装
# 同步代码安装
pip install elasticsearch
# 异步代码安装
python -m pip install elasticsearch[async]
index
创建index
创建一个名为news的索引
from elasticsearch import Elasticsearch
es = Elasticsearch()
result = es.indices.create(index='news',ignore=400)
print(result)
如果创建成功,会返回如下结果:
{'acknowledged': True, 'shards_acknowledged': True, 'index': 'news'}
返回结果是json格式,其中acknowledged字段表示创建操作执行成功
但这时如果我们再把代码执行一次的话,就会返回如下结果:
{'error': {'root_cause': [{'type': 'resource_already_exists_exception', 'reason': 'index [news/QxBPZzVwQhujlPqCLjOlVg] already exists', 'index_uuid': 'QxBPZzVwQhujlPqCLjOlVg', 'index': 'news'}], 'type': 'resource_already_exists_exception', 'reason': 'index [news/QxBPZzVwQhujlPqCLjOlVg] already exists', 'index_uuid': 'QxBPZzVwQhujlPqCLjOlVg', 'index': 'news'}, 'status': 400}
它表示创建失败,status状态码是400,错误原因是index已经存在了
注意: 这里我们的代码使用了ignore参数为400,说明如果返回结果是400的话,就忽略错误不会报错,程序不会执行抛出异常.
假如我们不加ignore这个参数的话:
es = Elasticsearch()
result = es.indices.create(index='news')
print(result)
再次执行就报错了:
raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
elasticsearch.exceptions.RequestError: TransportError(400, 'resource_already_exists_exception', 'index [news/QM6yz2W8QE-bflKhc5oThw] already exists')
这样程序的执行就会出现问题,所以说,我们需要善用 ignore 参数,把一些意外情况排除,这样可以保证程序的正常执行而不会中断。
删除index
删除index也是类似的,代码如下:
from elasticsearch import Elasticsearch
es = Elasticsearch()
result = es.indices.delete(index='news',ignore=[400,404])
这里也是使用了ignore参数,来忽略index不存在而删除失败导致程序中断的问题
如果删除成功,会输出如下结果:
{'acknowledged': True}
这个结果表明当前 Index 不存在,删除失败,返回的结果同样是 JSON,状态码是 400,但是由于我们添加了 ignore 参数,忽略了 400 状态码,因此程序正常执行输出 JSON 结果,而不是抛出异常
插入数据
Elasticsearch 就像 MongoDB 一样,在插入数据的时候可以直接插入结构化字典数据,插入数据可以调用 create() 方法,例如这里我们插入一条新闻数据:
from elasticsearch import Elasticsearch
es = Elasticsearch()
es.indices.create(index='news', ignore=400)
data = {'title': '美国留给伊拉克的是个烂摊子吗', 'url': 'http://view.news.qq.com/zt2011/usa_iraq/index.htm'}
result = es.create(index='news', doc_type='politics', id=1, body=data)
这里我们首先声明了一条新闻数据,包括标题和链接,然后通过调用 create() 方法插入了这条数据,在调用 create() 方法时,我们传入了四个参数,index 参数代表了索引名称,doc_type 代表了文档类型,body 则代表了文档具体内容,id 则是数据的唯一标识 ID。
运行结果如下:
{'_index': 'news', '_type': 'politics', '_id': '1', '_version': 1, 'result': 'created', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 0, '_primary_term': 1}
结果中 result 字段为 created,代表该数据插入成功。
另外其实我们也可以使用 index() 方法来插入数据,但与 create() 不同的是,create() 方法需要我们指定 id 字段来唯一标识该条数据,而 index() 方法则不需要,如果不指定 id,会自动生成一个 id,调用 index() 方法的写法如下:
es.index(index='news', doc_type='politics', body=data)
create() 方法内部其实也是调用了 index() 方法,是对 index() 方法的封装。
更新数据
更新数据也非常简单,我们同样需要指定数据的 id 和内容,调用 update() 方法即可,代码如下:
from elasticsearch import Elasticsearch
es = Elasticsearch()
data = {
'title': '美国留给伊拉克的是个烂摊子吗',
'url': 'http://view.news.qq.com/zt2011/usa_iraq/index.htm',
'date': '2011-12-16'
}
result = es.update(index='news', doc_type='politics', body=data, id=1)
print(result)
这里我们为数据增加了一个日期字段,然后调用了 update() 方法,结果如下:
{'_index': 'news', '_type': 'politics', '_id': '1', '_version': 2, 'result': 'updated', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 1, '_primary_term': 1}
可以看到返回结果中,result 字段为 updated,即表示更新成功,另外我们还注意到有一个字段 _version,这代表更新后的版本号数,2 代表这是第二个版本,因为之前已经插入过一次数据,所以第一次插入的数据是版本 1,可以参见上例的运行结果,这次更新之后版本号就变成了 2,以后每更新一次,版本号都会加 1。
如果报错:ActionRequestValidationException[Validation Failed: 1: script or doc is missing。解决方法:body中加’doc’节点,把其他包裹起来:body={‘doc’: data}
另外更新操作其实利用 index() 方法同样可以做到,写法如下:
es.index(index='news', doc_type='politics', body=data, id=1)
可以看到,index() 方法可以代替我们完成两个操作,如果数据不存在,那就执行插入操作,如果已经存在,那就执行更新操作,非常方便。
删除数据
如果想删除一条数据可以调用 delete() 方法,指定需要删除的数据 id 即可,写法如下:
from elasticsearch import Elasticsearch
es = Elasticsearch()
result = es.delete(index='news', doc_type='politics', id=1)
print(result)
运行结果如下:
{'_index': 'news', '_type': 'politics', '_id': '1', '_version': 3, 'result': 'deleted', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 2, '_primary_term': 1}
可以看到运行结果中 result 字段为 deleted,代表删除成功,_version 变成了 3,又增加了 1。
查询数据
上面的几个操作都是非常简单的操作,普通的数据库如 MongoDB 都是可以完成的,看起来并没有什么了不起的,Elasticsearch 更特殊的地方在于其异常强大的检索功能。
对于中文来说,我们需要安装一个分词插件,这里使用的是 elasticsearch-analysis-ik,GitHub 链接为:https://github.com/medcl/elasticsearch-analysis-ik,这里我们使用 Elasticsearch 的另一个命令行工具 elasticsearch-plugin 来安装,这里安装的版本是 6.2.4,请确保和 Elasticsearch 的版本对应起来,命令如下:
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.8/elasticsearch-analysis-ik-6.8.8.zip
这里的版本号请替换成你的 Elasticsearch 的版本号。
安装之后重新启动 Elasticsearch 就可以了,它会自动加载安装好的插件。
首先我们新建一个索引并指定需要分词的字段,代码如下:
from elasticsearch import Elasticsearch
es = Elasticsearch()
mapping = {
'properties': {
'title': {
'type': 'text',
'analyzer': 'ik_max_word',
'search_analyzer': 'ik_max_word'
}
}
}
es.indices.delete(index='news', ignore=[400, 404])
es.indices.create(index='news', ignore=400)
result = es.indices.put_mapping(index='news', doc_type='politics', body=mapping)
print(result)
这里我们先将之前的索引删除了,然后新建了一个索引,然后更新了它的 mapping 信息,mapping 信息中指定了分词的字段,指定了字段的类型 type 为 text,分词器 analyzer 和 搜索分词器 search_analyzer 为 ik_max_word,即使用我们刚才安装的中文分词插件。如果不指定的话则使用默认的英文分词器。
接下来我们插入几条新的数据:
datas = [
{
'title': '美国留给伊拉克的是个烂摊子吗',
'url': 'http://view.news.qq.com/zt2011/usa_iraq/index.htm',
'date': '2011-12-16'
},
{
'title': '公安部:各地校车将享最高路权',
'url': 'http://www.chinanews.com/gn/2011/12-16/3536077.shtml',
'date': '2011-12-16'
},
{
'title': '中韩渔警冲突调查:韩警平均每天扣1艘中国渔船',
'url': 'https://news.qq.com/a/20111216/001044.htm',
'date': '2011-12-17'
},
{
'title': '中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首',
'url': 'http://news.ifeng.com/world/detail_2011_12/16/11372558_0.shtml',
'date': '2011-12-18'
}
]
for data in datas:
es.index(index='news', doc_type='politics', body=data)
这里我们指定了四条数据,都带有 title、url、date 字段,然后通过 index() 方法将其插入 Elasticsearch 中,索引名称为 news,类型为 politics。
接下来我们根据关键词查询一下相关内容:
result = es.search(index='news', doc_type='politics')
print(result)
可以看到查询出了所有插入的四条数据:
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 4,
"max_score": 1.0,
"hits": [
{
"_index": "news",
"_type": "politics",
"_id": "c05G9mQBD9BuE5fdHOUT",
"_score": 1.0,
"_source": {
"title": "美国留给伊拉克的是个烂摊子吗",
"url": "http://view.news.qq.com/zt2011/usa_iraq/index.htm",
"date": "2011-12-16"
}
},
{
"_index": "news",
"_type": "politics",
"_id": "dk5G9mQBD9BuE5fdHOUm",
"_score": 1.0,
"_source": {
"title": "中国驻洛杉矶领事馆遭亚裔男子枪击,嫌犯已自首",
"url": "http://news.ifeng.com/world/detail_2011_12/16/11372558_0.shtml",
"date": "2011-12-18"
}
},
{
"_index": "news",
"_type": "politics",
"_id": "dU5G9mQBD9BuE5fdHOUj",
"_score": 1.0,
"_source": {
"title": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船",
"url": "https://news.qq.com/a/20111216/001044.htm",
"date": "2011-12-17"
}
},
{
"_index": "news",
"_type": "politics",
"_id": "dE5G9mQBD9BuE5fdHOUf",
"_score": 1.0,
"_source": {
"title": "公安部:各地校车将享最高路权",
"url": "http://www.chinanews.com/gn/2011/12-16/3536077.shtml",
"date": "2011-12-16"
}
}
]
}
}
可以看到返回结果会出现在 hits 字段里面,然后其中有 total 字段标明了查询的结果条目数,还有 max_score 代表了最大匹配分数。
另外我们还可以进行全文检索,这才是体现 Elasticsearch 搜索引擎特性的地方:
dsl = {
'query': {
'match': {
'title': '中国 领事馆'
}
}
}
es = Elasticsearch()
result = es.search(index='news', doc_type='politics', body=dsl)
print(json.dumps(result, indent=2, ensure_ascii=False))
这里我们使用 Elasticsearch 支持的 DSL 语句来进行查询,使用 match 指定全文检索,检索的字段是 title,内容是“中国领事馆”,搜索结果如下:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 2.546152,
"hits": [
{
"_index": "news",
"_type": "politics",
"_id": "dk5G9mQBD9BuE5fdHOUm",
"_score": 2.546152,
"_source": {
"title": "中国驻洛杉矶领事馆遭亚裔男子枪击,嫌犯已自首",
"url": "http://news.ifeng.com/world/detail_2011_12/16/11372558_0.shtml",
"date": "2011-12-18"
}
},
{
"_index": "news",
"_type": "politics",
"_id": "dU5G9mQBD9BuE5fdHOUj",
"_score": 0.2876821,
"_source": {
"title": "中韩渔警冲突调查:韩警平均每天扣1艘中国渔船",
"url": "https://news.qq.com/a/20111216/001044.htm",
"date": "2011-12-17"
}
}
]
}
}
这里我们看到匹配的结果有两条,第一条的分数为 2.54,第二条的分数为 0.28,这是因为第一条匹配的数据中含有“中国”和“领事馆”两个词,第二条匹配的数据中不包含“领事馆”,但是包含了“中国”这个词,所以也被检索出来了,但是分数比较低。
因此可以看出,检索时会对对应的字段全文检索,结果还会按照检索关键词的相关性进行排序,这就是一个基本的搜索引擎雏形。
另外 Elasticsearch 还支持非常多的查询方式,详情可以参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.3/query-dsl.html
以上便是对 Elasticsearch 的基本介绍以及 Python 操作 Elasticsearch 的基本用法。
资料推荐
另外推荐几个不错的学习站点:
Elasticsearch 权威指南:https://es.xiaoleilu.com/index.html
全文搜索引擎 Elasticsearch 入门教程:http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html
Elastic 中文社区:https://www.elasticsearch.cn/
应用场景
1、场景—:使用Elasticsearch作为主要的后端
传统项目中,搜索引擎是部署在成熟的数据存储的顶部,以提供快速且相关的搜索能力。这是因为早期的搜索引擎不能提供耐用的存储或其他经常需要的功能,如统计。
Elasticsearch是提供持久存储、统计等多项功能的现代搜索引擎。
如果你开始一个新项目,我们建议您考虑使用Elasticsearch作为唯一的数据存储,以帮助保持你的设计尽可能简单。
此种场景不支持包含频繁更新、事务(transaction)的操作。
举例如下:新建一个博客系统使用es作为存储。
1)我们可以向ES提交新的博文;
2)使用ES检索、搜索、统计数据。
ES作为存储的优势:
如果一台服务器出现故障时会发生什么?你可以通过复制 数据到不同的服务器以达到容错的目的。
注意:
整体架构设计时,需要我们权衡是否有必要增加额外的存储。
2、场景二:在现有系统中增加elasticsearch
由于ES不能提供存储的所有功能,一些场景下需要在现有系统数据存储的基础上新增ES支持。
举例1:ES不支持事务、复杂的关系(至少1.X版本不支持,2.X有改善,但支持的仍然不好),如果你的系统中需要上述特征的支持,需要考虑在原有架构、原有存储的基础上的新增ES的支持。
举例2:如果你已经有一个在运行的复杂的系统,你的需求之一是在现有系统中添加检索服务。一种非常冒险的方式是重构系统以支持ES。而相对安全的方式是:将ES作为新的组件添加到现有系统中。
如果你使用了如下图所示的SQL数据库和ES存储,你需要找到一种方式使得两存储之间实时同步。需要根据数据的组成、数据库选择对应的同步插件。可供选择的插件包括:
1)mysql、oracle选择 logstash-input-jdbc 插件。
2)mongo选择 mongo-connector工具。
假设你的在线零售商店的产品信息存储在SQL数据库中。 为了快速且相关的搜索,你安装Elasticsearch。
为了索引数据,您需要部署一个同步机制,该同步机制可以是Elasticsearch插件或你建立一个自定义的服务。此同步机制可以将对应于每个产品的所有数据和索引都存储在Elasticsearch,每个产品作为一个document存储(这里的document相当于关系型数据库中的一行/row数据)。
当在该网页上的搜索条件中输入“用户的类型”,店面网络应用程序通过Elasticsearch查询该信息。 Elasticsearch返回符合标准的产品documents,并根据你喜欢的方式来分类文档。 排序可以根据每个产品的被搜索次数所得到的相关分数,或任何存储在产品document信息,例如:最新最近加入的产品、平均得分,或者是那些插入或更新信息。 所以你可以只使用Elasticsearch处理搜索。这取决于同步机制来保持Elasticsearch获取最新变化。
3、场景三:使用elasticsearch和现有的工具
在一些使用情况下,您不必写一行代码就能通过elasticssearch完成一项工作。很多工具都可以与Elasticsearch一起工作,所以你不必到你从头开始编写。
例如,假设要部署一个大规模的日志框架存储,搜索,并分析了大量的事件。
如图下图,处理日志和输出到Elasticsearch,您可以使用日志记录工具,如rsyslog(www.rsyslog.com),Logstash(www.elastic.co/products/logstash),或Apache Flume(http://flume.apache.org)。
搜索和可视化界面分析这些日志,你可以使用Kibana(www.elastic.co/产品/ kibana)。
为什么那么多工具适配Elasticsearch?主要原因如下:
1)Elasticsearch是开源的。
2)Elasticsearch提供了JAVA API接口。
3)Elasticsearch提供了RESTful API接口(不管程序用什么语言开发,任何程序都可以访问)
4)更重要的是,REST请求和应答是典型的JSON(JavaScript对象 符号)格式。通常情况下,一个REST请求包含一个JSON文件,其回复都 也是一个JSON文件。
Cerebro es可视化工具
1、ElasticSearch Head
用途:展示ES(集群)数据信息
视图:https://mobz.github.io/elasticsearch-head/
下载:https://github.com/mobz/elasticsearch-head
ES-HEAD(插件下载与安装,非web插件):
https://github.com/mobz/elasticsearch-head
nodejs
https://nodejs.org/dist/
安装参考:https://blog.csdn.net/ziyetian666/article/details/79737541
ln -s /app/elastic/node-v11.6.0-linux-x64/bin/node /usr/local/bin/node
ln -s /app/elastic/node-v11.6.0-linux-x64/bin/npm /usr/local/bin/npm
2、elasticsearch-sql
用途:利用标准SQL查询ES数据
视图:
下载:https://github.com/NLPchina/elasticsearch-sql
3、kibana
用途:利用ES查询语法(json)检索ES数据
视图:
下载:https://www.elastic.co/downloads/kibana
汉化:https://blog.csdn.net/Gekkoou/article/details/80956191
Cerebro
推荐一款 ES 集群可视化工具:Cerebro,简单、实用!
这篇文章主要向大家介绍推荐一款 ES 集群可视化工具:Cerebro,简单、实用!,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。
标签:前端javanodegitgithubspringdocker后端服务器网络
Cerebro 是之前的 Elasticsearch 插件 Elasticsearch Kopf 的演变 – 这不适用于 Elasticsearch 版本5.x或更高版本,这是因为删除了 site plugins。前端
https://github.com/lmenezes/elasticsearch-kopfjava
Cerebro 是查看分片分配和最有用的界面之一经过图形界面执行常见的索引操做。 彻底开放源,而且它容许您添加用户,密码或 LDAP 身份验证问网络界面。Cerebro 是对先前插件的部分重写,而且能够做为自运行工具使用应用程序服务器,基于 Scala 的Play 框架。node
Cerebro 是一种现代反应性应用程序; 它使用 Scala 使用 Play 框架在 Scala 中编写,用于后端 REST 和 Elasticsearch 通讯。 此外,它使用经过 AngularJS 用JavaScript 编写的单页应用程序(SPA)前端。git
咱们能够发现 Cerebro 的安装网站:github
https://github.com/lmenezes/cerebro。spring
为了安装 Cerebro,你必须安装 Java 1.8 或更新的版本。 关注公众号Java技术栈,在后台回复:java,能够获取我整理的 Java 1.8+ 系列教程,很是齐全。docker
安装 Cerebro
为了安装 Cerebro,你将须要手动下载并安装它。 而后,咱们将执行如下步骤:后端
你能够下载 Cerebro 的二进制发行版。服务器
https://github.com/lmenezes/cerebro网络
对于 Linux 或 macOSX,咱们可使用如下命令:
wget -c https://github.com/lmenezes/cerebro/releases/download/v0.8.5/cerebro-0.8.5.tgz
tar xfvz cerebro-0.8.5.tgz
咱们能够在上面的github里找到最新的 cerebro 发行版本。截止目前为止,咱们能找到的最新的版本是 0.8.5。
若是你想作 docker 安装,请参阅连接:
https://github.com/lmenezes/cerebro-docker。
运行 cerebro
咱们能够经过以下的方式来运行 crebro:
cerebro-0.8.5/bin/cerebro
针对 Windows 操做系统来讲,咱们可使用以下的方式来运行:
cerebro-0.8.5/bin/cerebro.bat
在咱们的 console 里,咱们能够看到相似以下的输出:
从上面的输出咱们能够看出来,咱们能够经过 http://0.0.0.0:9000/ 开访问:
在上面,咱们须要输入咱们的 Elasticsearch 的 node address 来进行链接。点击 Connect 按钮:
在上面,咱们能够看到 overview tab 的界面。它显示了目前咱们的 node 的整体状况。
咱们能够点击 nodes tab,咱们能够看到以下的界面:
咱们点击rest tab,咱们能够输入咱们的DSL请求:
我能够在这个界面里发送咱们想要的 DSL 查询请求。
这里有点像咱们的 Kibana Dev tools。只是在这里咱们没有 auto-complete 功能。
咱们能够点 more tab:
状态栏:
在上面它显示咱们的 cluster 状态为 yellow,它表示咱们须要更多的节点来分别咱们的 shard。
这个 Cerebro 用户界面软件能够很方便地让咱们管理咱们的 Elasticsearch 集群。

浙公网安备 33010602011771号