[编程经验] Elasticsearch 初识

时间:2022-05-08
本文章向大家介绍[编程经验] 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