[编程经验] Elasticsearch 初识
Elasticsearch 中文网站: https://www.elastic.co/cn/
官网对Elasticsearch 介绍的第一句话:
Elasticsearch is a distributed, RESTful search and analytics engine capable of solving a growing number of use cases.
Elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。Elasticsearch 的底层是开源库 Lucene。 Lucene是一个更加底层的搜索引擎,但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elasticsearch 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。可以这样理解,Lucene就好像是百度,然后你在百度的基础上开发了一个更高级,方便的搜索引擎,就是Elasticsearch 。Elasticsearch可以看做是一个NoSQL的数据库,提供数据的增删改查等基础功能。什么是NoSQL呢?
"Next Generation Databases mostly addressing some of the points: being non-relational, distributed, open-source and horizontally scalable
下一代主要解决如下问题的数据库: 非关系型的,分布式的,开源的并且可以扁平扩展。
好,基本概念就说到这里,如果不懂也不影响你使用ElasticSearch,可以简单理解为它就是一个数据库,可以存放数据,但是存储的数据不是类似MySQL之类的结构化数据,最重要的是,ElasticSearch的检索速度非常快,基本查一条数据在毫秒级。另外还有一个基于Lucene的搜索引擎叫做 Solr, 它是Java搜索引擎服务器。
今天主要介绍一下怎么安装和在Python中怎么使用。
1. 安装-Ubuntu
1.1 ElasticSearch
下载地址: https://www.elastic.co/cn/downloads/elasticsearch
直接下载 zip文件就可以,下载之后,cd到安装的文件夹下面,然后执行:
./bin/elasticsearch
这样就开启了ElasticSearch服务,
然后执行:
curl http://localhost:9200/
这里如果没安装curl的话,需要先安装。
1.2 Kibana
Kibana是一个ElasticSearch的管理工具,可以可视化 Elasticsearch 中的数据,顺便也就下载了吧。这个挺好用的,功能很多,我也在摸索中。。
地址: https://www.elastic.co/cn/products/kibana
下载之后还是一样,cd到解压的文件下面,执行
./bin/kibana
然后打开浏览器,输入:
http://localhost:5601
然后你就能看到一个比较帅的界面,在左边有个Dev的选项,这里可以写各种增删改查的语句。
2. Python中使用Elasticsearch
2.1 安装
Python 中的Elasticsearch模块是Elasticsearch基于Python的客户端。安装很简单,直接用pip就可以,现在安装的版本是6.0.0.(2018-1-5)
pip install elasticsearch 或者 pip3 install elasticsearch
2.2 创建索引
from elasticsearch import Elasticsearch
es = Elasticsearch(hosts="localhost:9200")
# 这里默认是9200端口,如果你要把数据存到
# 别的地方(服务器),改一下这个地址就可以。
es.create(index='test_index',
doc_type='post')
2.3 将数据存入到ES中
数据存储有三种方法,一种是用index直接单条存入,一种是用indices类下面的create方法,如果索引存在则直接存入,如果不存在则创建索引,然后存入。还有一种是用bulk方法批量存,这个是比较常用的方法。你可以根据你的实际任务来选择。
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
es = Elasticsearch(hosts="localhost:9200")
index_name = "test_index"
try:
# 每次存入数据前,可以做个索引
# 是否存在的判断,防止冲突。
es.indices.delete(index=index_name)
except:
pass
# 单条存入
es.index(index="test_index",
doc_type="post",
id=1,
body={
"这里是你的数据": "这里是你的数据"}
)
# 或者
es.indices.create(index=index_name,
body={
"这里是你的数据": "这里是你的数据"}
)
# 批量存储
with open("file_test.txt", 'r') as fr:
lines = fr.readlines()
i = 0
bulk_data = []
for line in lines:
data = {
"_index": "test_index",
"_type": "post",
"_source": {
"content": line}
}
bulk_data.append(data)
i += 1
# 每隔10000条数据存一次。
if i % 10000 == 0:
bulk(es, bulk_data)
bulk_data = []
2.3 检索数据
当把数据存入ES之后,就是检索了,不然存进去不用,那就真的没啥用了,是吧。检索也比较简单,主要是要理清这里面的逻辑关系是,实在不懂就多试试。举个栗子。
body = {
"query": {
"match": {
"title": {
"query": "中国 "
}
}
}
}
es.search(index="test_index",
doc_type="post",
body=body)
这里就写个简单的栗子,网上有很多栗子,有需要的大家可以去找,后面我附一个比较好的博客。
然后我这里说一下我的使用感受,ElasticSearch主要是用来做检索的,你可以把它就理解为一个百度。所以熟练使用检索数据是很重要的。检索的时候,主要就是那个body里面写的东西,里面的query,match,是关键字,这个不能修改,title是你存储的时候定义的字段名字,然后“中国”是你要检索的内容。这里需要掌握的是match的用法,类似的还有match_phrase,关键字还有bool,should,must,must_not, filter,highlight,filter, boost等,所以这块就是需要灵活应用的地方,你需要理解每个关键字的用法,然后灵活应用到你的具体检索任务中,来完成你的任务。
学习资料: 1. https://github.com/looly/elasticsearch-definitive-guide-cn
2. https://www.cnblogs.com/cswuyg/p/5651620.html
- 【Go 语言社区】算法课程 第一季 第4节 100以内的素数
- Java案例-数组求余问题
- GO语言实现的端口扫描器分享
- Java案例-数组随机数
- Go语言图片处理和生成缩略图的方法
- Python3 怎么将Unicode转中文,以及GBK乱码ÖйúÉÙÊýÃñ×åÌØÉ«´åÕ¯
- 数据结构和算法——旋转打印链表
- C/C++——set的基本操作总结
- PHP基础——字符串的常用操作
- NLP之tfidf与textrank算法细节对比基于结巴分词
- 【Go 语言社区】算法课程 第一季 第4节-汉诺塔
- C/C++——map的基本操作总结
- Python生成词云图,TIIDF方法文本挖掘: 词频统计,词云图
- C/C++——vector的基本操作总结
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用 EasyPOI 优雅导出Excel模板数据(含图片)
- 不用一行代码,用 API 操作数据库,你信吗
- 实战 | PyQt5制作雪球网股票数据爬虫工具
- 数据结构:图文详解 - 动态查找、静态查找、散列查找
- 关于tf.train.ExponentialMovingAverage使用的详细解析
- 【课后作业】Azkaban 自动化调度
- 【项目实战】Azkaban 自动化调度
- 【课后作业】ADS 层数据导出
- 【课后作业】ADS 层创建&数据接入
- 【项目实战】ADS 层复购率统计
- java设计模式-单例模式详解
- 技术迭代迷茫?Android资深架构师教你如何打破这个局面!
- 基于空间矢量的机器人动力学:铰接体惯量法matlab程序
- leetcode树之相同的树
- 1. 两数之和