个人Elasticsearch系列文章,逐渐更新中,欢迎关注
0A.关于Elasticsearch及实例应用
00.Solr与ElasticSearch对比
01.ElasticSearch能作什么?
02.Elastic Stack功能介绍
03.如何安装与设置Elasticsearch API
04.若是经过elasticsearch的head插件创建索引_CRUD操做
05.Elasticsearch多个实例和head plugin使用介绍
06.当Elasticsearch进行文档索引时,它是如何工做的?
07.Elasticsearch中的映射方式—简洁版教程
08.Elasticsearch中的分析和分析器应用方式
09.Elasticsearch中构建自定义分析器
10.Kibana科普-做为Elasticsearhc开发工具
11.Elasticsearch查询方法
12.Elasticsearch全文查询
13.Elasticsearch查询-术语级查询
14.Python中的Elasticsearch入门html
另外Elasticsearch入门,我强烈推荐ElasticSearch搭建手册给你,很是想尽的入门指南手册。python
在本文中,我将讨论Elasticsearch以及如何将其与不一样的Python应用程序集成。数据库
什么是ElasticSearch?json
ElasticSearch(ES)是基于Apache Lucene构建的分布式且高度可用的开源搜索引擎。这是一个用Java构建的开源,所以可用于许多平台。您以JSON格式存储非结构化数据,这也使其成为NoSQL数据库。所以,与其余NoSQL数据库不一样,ES还提供搜索引擎功能和其余相关功能。segmentfault
ElasticSearch用例浏览器
您能够将ES用于多种用途,下面提供了其中的几个:架构
您正在运行的网站提供许多动态内容。不管是电子商务网站仍是博客。经过实施ES,您不只能够为您的Web应用程序提供强大的搜索引擎,还能够在应用程序中提供本机自动完成功能。app
您能够摄取不一样种类的日志数据,而后能够用来查找趋势和统计数据。curl
设置和运行
安装ElasticSearch的最简单方法是下载并运行可执行文件。您必须确保使用的是Java 7或更高版本。
下载后,解压缩并运行其二进制文件。elasticsearch
elasticsearch-6.2.4 bin / elasticsearch
滚动窗口中将有不少文本。若是您看到相似下面的内容,则代表状况已解决。
[2018-05-27T17:36:11,744] [INFO] [oehnNetty4HttpServerTransport] [c6hEGv4] publish_address {127.0.0.1:9200}、bound_addresses {[:: 1]:9200},{127.0.0.1:9200}
可是,既然眼见为实,http://localhost:9200那就在浏览器中或经过cURL 访问URL ,下面的内容应该会很欢迎您。
{
"name" : "c6hEGv4",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "HkRyTYXvSkGvkvHX2Q1-oQ",
"version" : {
"number" : "6.2.4", "build_hash" : "ccec39f", "build_date" : "2018-04-12T20:37:28.497551Z", "build_snapshot" : false, "lucene_version" : "7.2.1", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
如今,在我继续使用Python访问Elastic Search以前,让咱们作一些基本的事情。正如我提到的,ES提供了REST API,咱们将使用它来执行不一样的任务。
基本范例
您要作的第一件事就是建立一个 指数。一切都存储在索引中。RDBMS至关于指数 是一个 数据库 所以,请勿将其与您在RDBMS中学习的典型索引概念混淆。我正在使用PostMan运行REST API。
若是运行成功,您将在下面看到相似的响应。
{
“ acknowledged”:true, “ shards_acknowledged”:true, “ index”:“ company”
}
所以,咱们建立了一个名为company的数据库。换句话说,咱们建立了一个名为company的索引。若是您经过浏览器进行访问,则会看到相似如下内容:
http://localhost:9200/company { “ company”:{ “ aliases”:{ }, “ mappings”:{ }, “ settings”:{ “ index”:{ “ creation_date”:“ 1527638692850”, “ number_of_shards”:“ 5”, “ number_of_replicas”: “ 1”, “ uuid”:“ RnT-gXISSxKchyowgjZOkQ”, “ version”:{ “ created”:“ 6020499” }, “ provided_name”:“ company” } } } }
稍等片刻mappings,咱们稍后再讨论。实际上只不过是建立文档的架构而已。creation_date是不言自明的。的number_of_shards讲述,将让这个数据分区的数量指标。将所有数据保存在单个磁盘上根本没有任何意义。若是您正在运行包含多个Elastic节点的集群,则整个数据将在它们之间拆分。简而言之,若是有5个分片,则整个数据可在5个分片上使用,而且ElasticSearch集群能够处理来自其任何节点的请求。
副本谈论数据的镜像。若是您熟悉主从概念,那么这对您来讲应该不是新知识。您能够在此处了解有关基本ES概念的更多信息。
建立索引的cURL版本是单行的。
➜elasticsearch-6.2.4 curl -X PUT本地主机:9200 / company {“ acknowledged”:true,“ shards_acknowledged”:true,“ index”:“ company”}%
您还能够一次执行索引建立和记录插入任务。您要作的就是以JSON格式传递记录。在PostMan中,您能够像下面这样。
确保设置Content-Type为application/json
company若是它不存在,它将在此处建立一个名为的索引,而后在此处建立一个名为employee的新类型。类型其实是RDBMS 中表的ES版本。
上面的请求将输出如下JSON结构。
{ "_index": "company", "_type": "employees", "_id": "1", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1 }
您经过/1做为记录的ID。虽然没有必要。要作的就是_id用value 设置field 1。而后,您以JSON格式传递数据,该数据最终将做为新记录或文档插入。若是您http://localhost:9200/company/employees/1从浏览器访问,您将看到如下内容。
{"_index":"company","_type":"employees","_id":"1","_version":1,"found":true,"_source":{ "name": "Adnan Siddiqi", "occupation": "Consultant" } }
您能够看到实际记录以及元数据。若是您愿意,能够将请求更改成http://localhost:9200/company/employees/1/_source,它将仅输出记录的JSON结构。
cURL版本为:
{ "name" : "c6hEGv4", "cluster_name" : "elasticsearch", "cluster_uuid" : "HkRyTYXvSkGvkvHX2Q1-oQ", "version" : { "number" : "6.2.4", "build_hash" : "ccec39f", "build_date" : "2018-04-12T20:37:28.497551Z", "build_snapshot" : false, "lucene_version" : "7.2.1", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" }
若是您想更新该记录怎么办?好吧,这很简单。您要作的就是更改JSON记录。以下所示:
它将生成如下输出:
{ "company": { "aliases": { }, "mappings": { }, "settings": { "index": { "creation_date": "1527638692850", "number_of_shards": "5", "number_of_replicas": "1", "uuid": "RnT-gXISSxKchyowgjZOkQ", "version": { "created": "6020499" }, "provided_name": "company" } } } }
请注意,该_result字段如今设置为updated而不是created
固然,您也能够删除某些记录。
并且,若是您快要疯了或者您的女友已经抛弃了您,则能够经过curl -XDELETE localhost:9200/_all从命令行运行来烧毁整个世界。
让咱们作一些基本的搜索。若是运行http://localhost:9200/company/employees/_search?q=adnan,它将搜索类型下的全部字段employees并返回相关记录。
{ "_index": "company", "_type": "employees", "_id": "1", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1 }
该max_score字段指示记录的相关性,即记录的最高分数。若是有多个记录,那么它将是另外一个数字。
您还能够经过传递字段名称来将搜索条件限制为某个字段。所以,http://localhost:9200/company/employees/_search?q=name:Adnan将仅在name文档的字段中搜索。它实际上等效于SQLSELECT * from table where name='Adnan'
我只介绍了基本示例。ES能够作不少事情,可是我将经过阅读文档让您进一步探索它,而后切换到使用Python访问ES。
在Python中访问ElasticSearch
老实说,ES的REST API足够好,您可使用requests库来执行全部任务。不过,您能够将Python库用于ElasticSearch,以专一于主要任务,而没必要担忧如何建立请求。
经过pip安装它,而后能够在Python程序中访问它。
pip install elasticsearch
为确保已正确安装,请从命令行运行如下基本代码段:
➜elasticsearch-6.2.4 python
Python 3.6.4 | Anaconda自定义(64位)| (默认值,2018年1月16日,12:04:33)
在darwin上使用[GCC 4.2.1兼容的Clang 4.0.1(标签/ RELEASE_401 / final)]输入如下内容的
“帮助”,“版权”,“信用”或“许可证”更多信息。
➜ elasticsearch-6.2.4 python
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 12:04:33)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from elasticsearch import Elasticsearch >>> es = Elasticsearch([{'host': 'localhost', 'port': 9200}]) >>> es <Elasticsearch([{'host': 'localhost', 'port': 9200}])>
网页搜索和Elasticsearch
让咱们讨论一下使用Elasticsearch的一些实际用例。目的是访问在线食谱并将其存储在Elasticsearch中以用于搜索和分析目的。咱们将首先从Allrecipes抓取数据并将其存储在ES中。若是是ES,咱们还将建立一个严格的Schema或映射,以便确保以正确的格式和类型对数据进行索引。我只是拉沙拉食谱的清单而已。让咱们开始!
抓取数据
结论Elasticsearch是一个功能强大的工具,经过提供强大的功能以返回最准确的结果集,能够帮助您搜索现有或新应用。我刚刚介绍了要点。阅读文档并熟悉这个强大的工具。特别是模糊搜索功能很是出色。若是有机会,我将在之后的文章中介绍Query DSL。