翼度科技»论坛 编程开发 python 查看内容

Python工具箱系列(三十二)

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
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)上安装。其安装过程如下所述:
  1. # 这个安装过程也有可能非常慢。
  2. wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
  3. sudo apt-get install apt-transport-https
  4. echo "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.list
  5. sudo apt-get update && sudo apt-get install -y elasticsearch
复制代码
另一个简单的办法就是直接下载安装包。从官网上下载:
  1. # 在ubuntu bionic目标机的终端下
  2. wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.3.2-amd64.deb
  3. sudo dpkg -i elasticsearch-8.3.2-amd64.deb
复制代码
这种方式的好处是可以复制deb文件以多个计算机上,从而节省下载时间。需要安装的目标计算机越多,这种方式越合算。
在ubuntu bionic下,可以使用systemd对其进行管理。相关命令如下:
  1. sudo /bin/systemctl daemon-reload
  2. # 自动启动
  3. sudo /bin/systemctl enable elasticsearch
  4. # 启动
  5. sudo systemctl start elasticsearch
  6. # 查看状态
  7. sudo systemctl status elasticsearch
  8. # 如果出现错误,可以查看日志。
  9. journalctl -f
  10. journalctl -u elasticsearch
  11. # 停止
  12. sudo systemctl stop elasticsearch
  13. # 重置口令,人工指定
  14. /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i
  15. # 重置口令,自动生成
  16. /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
  17. # 测试之
  18. curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic https://localhost:9200
  19. curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic https://172.29.30.155:9200
复制代码
获得的响应类似下列信息:
  1. {
  2.   "name" : "dbservers",
  3.   "cluster_name" : "elasticsearch",
  4.   "cluster_uuid" : "LFs6cpSHTSqLqbx6lRgkvw",
  5.   "version" : {
  6.     "number" : "8.3.2",
  7.     "build_type" : "deb",
  8.     "build_hash" : "8b0b1f23fbebecc3c88e4464319dea8989f374fd",
  9.     "build_date" : "2022-07-06T15:15:15.901688194Z",
  10.     "build_snapshot" : false,
  11.     "lucene_version" : "9.2.0",
  12.     "minimum_wire_compatibility_version" : "7.17.0",
  13.     "minimum_index_compatibility_version" : "7.0.0"
  14.   },
  15.   "tagline" : "You Know, for Search"
  16. }
复制代码
Elasticsearch的功能非常复杂,需要下功夫学习,本文只从python的角度来使用这个工具。官方推荐的模块安装如下:
  1. pip install elasticsearch
  2. # 为了能够完成安全验证,需要下载相关的证书到本地
  3. scp root@172.29.30.155:/etc/elasticsearch/certs/http_ca.crt .
复制代码
完成后,以下代码简单示例了如何插入记录:
  1. from elasticsearch import Elasticsearch
  2. from datetime import datetime
  3. serverip = "172.29.30.155"
  4. cafile = r"d:\http_ca.crt"
  5. ELASTIC_PASSWORD = "88488848"
  6. indexname = "poetry"
  7. index = 0
  8. def connect():
  9.     client = Elasticsearch(
  10.         f"https://{serverip}:9200", ca_certs=cafile, basic_auth=("elastic", ELASTIC_PASSWORD))
  11.     return client
  12. def docgen(author, content):
  13.     doc = {'author': author, 'text': content, 'timestamp': datetime.now(), }
  14.     return doc
  15. def insert(con, id, doc):
  16.     resp = con.index(index=indexname, id=id, document=doc)
  17.     return resp['result']
  18. def getbyindex(con, id):
  19.     resp = con.get(index=indexname, id=id)
  20.     return resp['_source']
  21. def list(con):
  22.     resp = con.search(index=indexname, query={"match_all": {}})
  23.     print("Got %d Hits:" % resp['hits']['total']['value'])
  24.     for hit in resp['hits']['hits']:
  25.         print("%(timestamp)s %(author)s: %(text)s" % hit["_source"])
  26. def search(con, str):
  27.     resp = con.search(index=indexname, query={"match": {"text": str}})
  28.     print("Got %d Hits:" % resp['hits']['total']['value'])
  29.     for hit in resp['hits']['hits']:
  30.         print("%(timestamp)s %(author)s: %(text)s" % hit["_source"])
  31. # 连接
  32. con = connect()
  33. # 插入记录
  34. index += 1
  35. doc = docgen("李白", "天生我才必有用")
  36. print(insert(con, index, doc))
  37. index += 1
  38. doc = docgen("杜甫", "功盖三分国,名成八阵图,江流石不转,遗恨失吞吴")
  39. print(insert(con, index, doc))
  40. # 准确获得记录
  41. print(getbyindex(con, 1))
  42. # 列出所有记录
  43. list(con)
  44. # 使用搜索功能,找到相关记录
  45. search(con, "天生")
复制代码
上述代码只是简单地插入了2条记录。真正要发挥作用搜索引擎的能力,必须要将大量的信息导入,同时也要建设集群系统,这部分的内容请阅读官网相关资料,本文不再重复。

来源:https://www.cnblogs.com/shanxihualu/p/17402413.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具