快讯:Python工具箱系列(三十二)

2023-05-15 17:14:43    来源:博客园


(相关资料图)

Elasticsearch

Elasticsearch是一个基于Lucene的搜索引擎。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful 的API接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是非常流行的企业级搜索引擎。官方支持的客户端语言包括Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby等。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,而Solr也是基于Lucene开发的。

Elasticsearch的安装方式有许多,官方也特别希望能够在公有云上部署。本文选择最简单的方式,直接在自己掌握的主机(ip:172.29.30.155)上安装。其安装过程如下所述:

# 这个安装过程也有可能非常慢。wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpgsudo apt-get install apt-transport-httpsecho "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.listsudo apt-get update && sudo apt-get install -y elasticsearch

另一个简单的办法就是直接下载安装包。从官网上下载:

# 在ubuntu bionic目标机的终端下wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.3.2-amd64.debsudo dpkg -i elasticsearch-8.3.2-amd64.deb

这种方式的好处是可以复制deb文件以多个计算机上,从而节省下载时间。需要安装的目标计算机越多,这种方式越合算。

在ubuntu bionic下,可以使用systemd对其进行管理。相关命令如下:

sudo /bin/systemctl daemon-reload# 自动启动sudo /bin/systemctl enable elasticsearch# 启动sudo systemctl start elasticsearch# 查看状态sudo systemctl status elasticsearch# 如果出现错误,可以查看日志。journalctl -fjournalctl -u elasticsearch# 停止sudo systemctl stop elasticsearch# 重置口令,人工指定/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i# 重置口令,自动生成/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic# 测试之curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic https://localhost:9200curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic https://172.29.30.155:9200

获得的响应类似下列信息:

{  "name" : "dbservers",  "cluster_name" : "elasticsearch",  "cluster_uuid" : "LFs6cpSHTSqLqbx6lRgkvw",  "version" : {    "number" : "8.3.2",    "build_type" : "deb",    "build_hash" : "8b0b1f23fbebecc3c88e4464319dea8989f374fd",    "build_date" : "2022-07-06T15:15:15.901688194Z",    "build_snapshot" : false,    "lucene_version" : "9.2.0",    "minimum_wire_compatibility_version" : "7.17.0",    "minimum_index_compatibility_version" : "7.0.0"  },  "tagline" : "You Know, for Search"}

Elasticsearch的功能非常复杂,需要下功夫学习,本文只从python的角度来使用这个工具。官方推荐的模块安装如下:

pip install elasticsearch# 为了能够完成安全验证,需要下载相关的证书到本地scp root@172.29.30.155:/etc/elasticsearch/certs/http_ca.crt .

完成后,以下代码简单示例了如何插入记录:

from elasticsearch import Elasticsearchfrom datetime import datetimeserverip = "172.29.30.155"cafile = r"d:\http_ca.crt"ELASTIC_PASSWORD = "88488848"indexname = "poetry"index = 0def connect():    client = Elasticsearch(        f"https://{serverip}:9200", ca_certs=cafile, basic_auth=("elastic", ELASTIC_PASSWORD))    return clientdef docgen(author, content):    doc = {"author": author, "text": content, "timestamp": datetime.now(), }    return docdef insert(con, id, doc):    resp = con.index(index=indexname, id=id, document=doc)    return resp["result"]def getbyindex(con, id):    resp = con.get(index=indexname, id=id)    return resp["_source"]def list(con):    resp = con.search(index=indexname, query={"match_all": {}})    print("Got %d Hits:" % resp["hits"]["total"]["value"])    for hit in resp["hits"]["hits"]:        print("%(timestamp)s %(author)s: %(text)s" % hit["_source"])def search(con, str):    resp = con.search(index=indexname, query={"match": {"text": str}})    print("Got %d Hits:" % resp["hits"]["total"]["value"])    for hit in resp["hits"]["hits"]:        print("%(timestamp)s %(author)s: %(text)s" % hit["_source"])# 连接con = connect()# 插入记录index += 1doc = docgen("李白", "天生我才必有用")print(insert(con, index, doc))index += 1doc = docgen("杜甫", "功盖三分国,名成八阵图,江流石不转,遗恨失吞吴")print(insert(con, index, doc))# 准确获得记录print(getbyindex(con, 1))# 列出所有记录list(con)# 使用搜索功能,找到相关记录search(con, "天生")

上述代码只是简单地插入了2条记录。真正要发挥作用搜索引擎的能力,必须要将大量的信息导入,同时也要建设集群系统,这部分的内容请阅读官网相关资料,本文不再重复。

关键词: