环球微头条丨上穷碧落下凡尘:Win10基于Docker配置Elasticsearch7全文检索交互

首页>焦点 > 正文
2023-02-01 08:59:15

来源:刘悦技术分享

基于文档式的全文检索引擎大家都不陌生,之前一篇文章:使用Redisearch实现的全文检索功能服务,曾经使用Rediseach来小试牛刀了一把,文中戏谑的称Rediseach已经替代了Elasticsearch,其实不然,Elasticsearch作为老牌的全文检索引擎还并没有退出历史舞台,依旧占据主流市场,桃花依旧笑春风,阿里也在其ecs服务中推出了云端Elasticsearch引擎,所以本次我们在Win10系统中依托Docker来感受一下Elasticsearch的魅力。


(资料图片仅供参考)

首先安装Docker,具体流程请参照:win10系统下把玩折腾DockerToolBox以及更换国内镜像源(各种神坑),这里不再赘述。

拉取Elasticsearch镜像,这里我们使用7.0以上的版本,该版本从性能和效率上都得到了优化。

docker pull elasticsearch:7.2.0

随后运行Elasticsearch镜像

docker run --name es -p 9200:9200 -p 9300:9300 -e \"discovery.type=single-node\" -d elasticsearch:7.2.0

容器别名我们就用缩写es来替代,通过 9200 端口并使用 Elasticsearch 的原生 传输 协议和集群交互。集群中的节点通过端口 9300 彼此通信。如果这个端口没有打开,节点将无法形成一个集群,运行模式先走单节点模式。

启动容器成功后,可以访问一下浏览器: http://localhost:9200

OK,没有任何问题,Elasticsearch 采用 YAML 文件对系统进行配置,原理很简单,就像Django的settings或者Flask的Config,只要通知Elasticsearch服务在运行过程中一些你想要的功能,而Elasticsearch会找到elasticsearch.yml,之后按你指定的参数运行服务。

此时,我们需要将容器内部Elasticsearch的配置文件拷贝出来,这样以后启动容器就可以按照我们自己指定的配置来修改了。

docker cp 容器id:/usr/share/elasticsearch/config/elasticsearch.yml ./elasticsearch.yml

老规矩,前面的是容器内地址,后面的是宿主机地址,这里我就拷贝到当前目录下,当然了,你也可以指定绝对路径。

打开elasticsearch.yml,可以自己加一些配置,比如允许跨域访问,这样你这台Elasticsearch就可以被别的服务器访问了,这是微服务全文检索系统架构的第一步。

cluster.name: \"docker-cluster\"network.host: 0.0.0.0http.cors.enabled: truehttp.cors.allow-origin: \"*\"

然后停止正在运行的Elasticsearch容器,并且删除它。

docker stop 容器iddocker rm $(docker ps -a -q)

再次启动Elasticsearch容器,这一次不同的是,我们需要通过-v挂载命令把我们刚刚修改好的elasticsearch.yml挂载到容器内部去,这样容器就根据我们自己修改的配置文件来运行Elasticsearch服务。

docker run --name es -v /es/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -p 9200:9200 -p 9300:9300 -e \"discovery.type=single-node\" -d elasticsearch:7.2.0

这里需要注意一点,就是在Win10宿主机里需要单独设置一下共享文件夹,这里我设置的共享文件夹叫做es,如果是Centos或者Mac os就直接写真实物理路径即可。

这里再简单介绍一下Win10如何设置共享文件夹用来配合Docker的挂载,打开virtualBox设置,新建一个共享文件夹es

随后,重启Docker,输入命令进入默认容器:docker-machine ssh default

在容器根目录能够看到刚刚设置的共享文件夹,就说明设置成功了。

另外还有一个需要注意的点,就是Elasticsearch存储数据也可以通过-v命令挂载出来,如果不对数据进行挂载,当容器被停止或者删除,数据也会不复存在,所以挂载后存储在宿主机会比较好一点,命令是:

docker run --name es -v /es/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /es/data:/usr/share/elasticsearch/data -p 9200:9200 -p 9300:9300 -e \"discovery.type=single-node\" -d elasticsearch:7.2.0

再次启动容器成功之后,我们就可以利用Python3来和全文检索引擎Elasticsearch进行交互了,安装依赖的库。

pip3 install elasticsearch

新建es_test.py测试脚本

建立Elasticsearch的检索实例

from elasticsearch import Elasticsearch es = Elasticsearch(hosts=[{\"host\":"Docker容器所在的ip", \"port\": 9200}])

这里的host指容器ip,因为可以扩展集群,所以是一个list,需要注意一点,如果是Win10就是系统分配的那个ip,Centos或者Mac os直接写127.0.0.1即可。

建立索引(Index),这里我们创建一个名为 article 的索引

result = es.indices.create(index="article", ignore=400)print(result){"acknowledged": True, "shards_acknowledged": True, "index": "article"}

其中的 acknowledged 字段表示创建操作执行成功。

删除索引也是类似的,代码如下:

result = es.indices.delete(index="article", ignore=[400, 404])print(result){"acknowledged": True}

插入数据,Elasticsearch 就像 MongoDB 一样,在插入数据的时候可以直接插入结构化字典数据,插入数据可以调用 index() 方法,这里索引和数据是强关联的,所以插入时需要指定之前建立好的索引。

data = {"title": "我在北京学习人工智能", "url": "http://123.com","content":\"在北京学习\"}result = es.index(index="article",body=data)print(result){"_index": "article", "_type": "_doc", "_id": "GyJgb3MBuQaE6wYOApTh", "_version": 1, "result": "created", "_shards": {"total": 2, "successful": 1, "failed": 0}, "_seq_no": 5, "_primary_term": 1}

可以看到index()方法会自动生成一个唯一id,当然我们也可以使用create()方法创建数据,不同的是create()需要手动指定一个id。

修改数据也非常简单,我们同样需要指定数据的 id 和内容,调用 index() 方法即可,代码如下:

data = {"content":\"在北京学习python\"}#修改result = es.index(index="article",body=data, id="GyJgb3MBuQaE6wYOApTh"){"_index": "article", "_type": "_doc", "_id": "GyJgb3MBuQaE6wYOApTh", "_version": 2, "result": "updated", "_shards": {"total": 2, "successful": 1, "failed": 0}, "_seq_no": 6, "_primary_term": 1}

删除数据,可以调用 delete() 方法,指定需要删除的数据 id 即可

#删除result = es.delete(index="article",id="GyJgb3MBuQaE6wYOApTh")print(result){"_index": "article", "_type": "_doc", "_id": "GyJgb3MBuQaE6wYOApTh", "_version": 3, "result": "deleted", "_shards": {"total": 2, "successful": 1, "failed": 0}, "_seq_no": 7, "_primary_term": 1}

查询数据,这里可以简单的查询全量数据:

#查询result = es.search(index="article")print(result){"took": 1079, "timed_out": False, "_shards": {"total": 1, "successful": 1, "skipped": 0, "failed": 0}, "hits": {"total": {"value": 5, "relation": "eq"}, "max_score": 1.0, "hits": [{"_index": "article", "_type": "blog", "_id": "1", "_score": 1.0, "_source": {"title": "我在北京学习人工智能", "url": "http://123.com", "content": "在北京学习"}}, {"_index": "article", "_type": "blog", "_id": "FyIdb3MBuQaE6wYO8JQR", "_score": 1.0, "_source": {"title": "你好", "content": "你好123"}}, {"_index": "article", "_type": "blog", "_id": "GCIeb3MBuQaE6wYOnpSv", "_score": 1.0, "_source": {"title": "你好", "url": "http://123.com", "content": "你好123"}}, {"_index": "article", "_type": "blog", "_id": "GSJfb3MBuQaE6wYOu5RD", "_score": 1.0, "_source": {"title": "你好", "url": "http://123.com", "content": "你好123"}}, {"_index": "article", "_type": "blog", "_id": "GiJfb3MBuQaE6wYO5pR4", "_score": 1.0, "_source": {"title": "你好", "url": "http://123.com", "content": "你好123"}}]}}

还可以进行全文检索,这才是体现 Elasticsearch 搜索引擎特性的地方。

mapping = {    "query": {        "match": {            "content": "学习 北京"        }    }}result = es.search(index="article",body=mapping)print(result){"took": 4, "timed_out": False, "_shards": {"total": 1, "successful": 1, "skipped": 0, "failed": 0}, "hits": {"total": {"value": 1, "relation": "eq"}, "max_score": 4.075481, "hits": [{"_index": "article", "_type": "blog", "_id": "1", "_score": 4.075481, "_source": {"title": "我在北京学习人工智能", "url": "http://123.com", "content": "在北京学习"}}]}}

可以看出,检索时会对对应的字段全文检索,结果还会按照检索关键词的相关性进行排序,这就是一个基本的搜索引擎雏形。

除了这些最基本的操作,Elasticsearch还支持很多复杂的查询,可以参照最新的7.2版本文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.2/query-dsl.html

结语:体验了之后,有人说,Elasticsearch这玩意还真不错,能不能把Mysql或者Mongo全都扔了,就拿它当数据库不就完事了吗?答案当然是不可能的,因为Elasticsearch没有事务,而且是查询是近实时,写入速度很慢,只是读取数据快,成本也比数据库高,几乎就在靠吃内存提高性能,它目前只是作为搜索引擎的存在,如果你的业务涉及全文检索,那么它就是你的首选方案之一。

标签: 全文检索 共享文件夹 人工智能

THE END
免责声明:本文系转载,版权归原作者所有;旨在传递信息,不代表热讯制鞋网的观点和立场。

相关热点

新华社电 上海市文化和旅游局近日发布《上海市密室剧本杀内容备案管理规定(征求意见稿)》,并截至12月8日面向社会公众广泛征求意见。这
2021-11-19 13:46:03
《中国证券报》17日刊发文章《备战2022 基金经理调仓换股布新局》。文章称,距离2021年结束仅剩一个多月,基金业绩分化明显。部分排名靠前
2021-11-19 13:46:03
交通运输部办公厅 中国人民银行办公厅 中国银行保险监督管理委员会办公厅关于进一步做好货车ETC发行服务有关工作的通知各省、自治区、直
2021-11-19 13:45:58
新华社北京11月17日电 题:从10月份市场供需积极变化看中国经济韧性新华社记者魏玉坤、丁乐读懂中国经济,一个直观的视角就是市场供需两端
2021-11-19 13:45:58
全国教育财务工作会议披露的消息称,2020年,中国国家财政性教育经费投入达4 29万亿元,占GDP总量的4 206%,我国国家财政性教育经费支出占G
2021-11-19 13:45:48
如果你也热爱“种草”,前方高能预警!让你心心念念、“浏览”忘返的网络平台,可能早已成为一块块“韭菜地”。近日,据《半月谈》报道,有...
2021-11-19 13:45:48
日前,工业和信息化部印发《“十四五”信息通信行业发展规划》(以下简称《规划》),描绘了未来5年信息通信行业的发展趋势。《规划》指出...
2021-11-19 13:45:40
本报讯(中青报·中青网记者 周围围)2021年快递业务旺季正式拉开帷幕。国家邮政局监测数据显示,仅11月1日当日,全国共揽收快递包裹5 69
2021-11-19 13:45:40
人民网曼谷11月17日电 (记者赵益普)17日上午,中国援柬埔寨第七批200万剂科兴新冠疫苗抵达金边国际机场。当天,柬埔寨政府在机场举行了
2021-11-19 13:45:35
金坛压缩空气储能国家试验示范项目主体工程一角受访者供图依托清华大学非补燃压缩空气储能技术,金坛压缩空气储能项目申请专利百余项,建立
2021-11-19 13:45:35
视觉中国供图42亿立方米据有关部门预计,今年山西煤炭产量有望突破12亿吨,12月份山西外送电能力将超过900万千瓦,今冬明春煤层气产量将达4
2021-11-19 13:44:34
14省份相继发布2021年企业工资指导线——引导企业合理提高职工工资今年以来,天津、新疆、内蒙古、陕西、西藏、山东、江西、山西、福建、四
2021-11-19 13:44:34
中新网客户端北京11月18日电 (记者 谢艺观)“一条路海角天涯,两颗心相依相伴,风吹不走誓言,雨打不湿浪漫,意济苍生苦与痛,情牵天下喜
2021-11-19 13:44:31
近日,交通运输部等三部门发布《关于进一步做好货车ETC发行服务有关工作的通知》。通知提到,对不具备授信条件的用户,商业银行可在依法合
2021-11-19 13:44:31
欧莱雅面膜陷优惠“年度最大”风波 涉及该事件集体投诉超6000人次美妆大牌双十一促销翻车?近日,因预售价格比双十一现货贵出66%,欧莱雅
2021-11-19 13:44:13
43 6%受访者会在工作两三年后考虑跳槽54 3%受访者认为跳槽对个人职业发展有利有弊如今对不少年轻人来说,想对一份工作“从一而终”不太容易
2021-11-19 13:44:13
超八成受访青年表示如有机会愿意开展副业 规划能力最重要64 4%受访青年指出做副业跟风心态最要不得如今,“身兼数职”已成为年轻人当中的
2021-11-19 13:44:01
发展氢能正当其时【科学随笔】氢能是一种二次能源,它通过一定的方法利用其他能源制取,具有清洁无污染、可储存、与多种能源便捷转换等优点
2021-11-19 13:44:01
“千杯不醉”的解酒“神药”能信吗?专家:网红“解酒药” 其实不算药俗话说,“酒逢知己千杯少”,酒一直是国人饭桌上至关重要的存在。尽...
2021-11-19 13:43:57
最新文章

相关推荐