当前位置: 首页 > 后端技术 > Python

上穷碧落下凡尘-Win10系统下基于Docker配置Elasticsearch7配合Python3进行全文检索交互

时间:2023-03-26 19:22:31 Python

落魄落俗:Win10系统下,基于Docker配置Elasticsearch7,配合Python3进行全文搜索交互不陌生,上一篇:使用Redisearch实现全文搜索功能服务,我曾经用过重新尝试一下。文章开玩笑说Rediseach已经取代了Elasticsearch。事实上,Elasticsearch作为一个老牌的全文搜索引擎,目前还没有退出历史舞台,依然占据着主流市场。桃花依旧微笑。阿里在其ecs服务中也推出了云Elasticsearch引擎,所以这次我们在Win10系统中借助Docker来感受一下Elasticsearch的魅力。首先安装Docker。具体过程可以参考:win10系统下玩转DockerToolBox,替换国内镜像源(各种魔坑),这里不再赘述。拉取Elasticsearch镜像,这里我们使用7.0以上的版本,在性能和效率上做了优化。dockerpullelasticsearch:7.2.0然后运行Elasticsearch镜像dockerrun--namees-p9200:9200-p9300:9300-e"discovery.type=single-node"-delasticsearch:7.2.0容器别名我们使用es代替缩写,它通过端口9200与集群交互,并使用Elasticsearch的原生传输协议。集群中的节点之间通过9300端口进行通信,如果不打开该端口,节点将无法形成集群,运行模式将优先为??单节点模式。容器启动成功后,可以浏览器访问:http://localhost:9200OK,没有问题,Elasticsearch使用YAML文件配置系统,原理很简单,就像Django的settings或者Flask的Config,只是在运行过程中通知Elasticsearch服务一些你想要的功能,Elasticsearch会找到elasticsearch.yml,然后根据你指定的参数运行服务。此时我们需要将容器内部Elasticsearch的配置文件复制一份,这样容器启动后就可以根据自己指定的配置修改容器了。dockercpcontainerid:/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容器并删除它。dockerstopcontaineriddockerrm$(dockerps-a-q)再次启动Elasticsearch容器,这次不同的是我们需要通过-vmount命令将刚才修改的elasticsearch.yml挂载到容器中,在这个方式,容器根据我们自己修改的配置文件运行Elasticsearch服务。dockerrun--namees-v/es/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml-p9200:9200-p9300:9300-e"discovery.type=single-node"-dElasticsearch:7.2.0这里需要注意一点,需要在Win10主机中单独设置一个共享文件夹。我这里设置的共享文件夹叫es。如果是Centos或者Macos,直接写真实的物理路径即可。这里简单介绍下如何在Win10中设置共享文件夹配合Docker的挂载,打开virtualBox设置,新建一个共享文件夹es,然后重启Docker,输入命令进入默认容器:docker-machinessh默认可以安装在容器的根目录如果看到刚才设置的共享文件夹就说明设置成功了。还有一点需要注意的是,存储在Elasticsearch中的数据也可以通过-v命令挂载。如果不挂载数据,当容器停止或删除时,数据将不复存在,所以挂载后,存放在宿主机机会比较好,命令为:dockerrun--namees-v/es/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml-v/es/data:/usr/share/elasticsearch/data-p9200:9200-p9300:9300-e"discovery.type=single-node"-delasticsearch:7.2.0容器再次启动成功后,我们就可以使用Python3与全文搜索引擎Elasticsearch进行交互了。安装依赖库。pip3installelasticsearch新建一个es_test.py测试脚本新建一个Elasticsearch检索实例fromelasticsearchimportElasticsearches=Elasticsearch(hosts=[{"host":'Dockercontainer'sip',"port":9200}])其中host指的是to容器ip是一个列表,因为集群可以扩容。需要注意一点,如果是Win10,就是系统分配的ip。Centos或Macos直接写127.0.0.1即可。创建一个索引(Index),这里我们创建一个名为articleresult=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='文章',正文=数据)打印(结果){'_index':'文章','_type':'_doc','_id':'GyJgb3MBuQaE6wYOApTh','_version':1,'结果':'创建','_shards':{'total':2,'successful':1,'failed':0},'_seq_no':5,'_primary_term':1}可以看到index()方法会自动生成一个uniqueid,当然我们也可以使用create()方法来创建数据,不同的是create()需要手动指定一个id。修改数据也很简单,我们也需要指定数据的id和内容,调用index()方法即可,代码如下:data={'content':"北京学python"}#Modifyresult=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即可#deleteresult=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}查询数据,这里可以简单查询全量数据:#queryresult=es.search(index='article')print(result){'take':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':'你好','内容':'你好123'}},{'_index':'文章','_type':'博客','_id':'GCIeb3MBuQaE6wYOnpSv','_score':1.0,'_source':{'title':'你好','url':'http://123.com','content':'你好123'}},{'_index':'文章','_type':'博客','_id':'GSJfb3MBuQaE6wYOu5RD','_score':1.0,'_source':{'title':'你好','url':'http://123.com','内容':'你好123'}},{'_index':'article','_type':'blog','_id':'GiJfb3MBuQaE6wYO5pR4','_score':1.0,'_source':{'title':'Hello','url':'http://123.com','content':'Hello123'}}]}}还可以进行全文搜索,这就是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/...结论:体验过后,有人说Elasticsearch这个东西真不错,能不能把Mysql或者Mongo扔掉,直接当数据库用?答案当然是不可能的,因为Elasticsearch没有事务,查询是接近实时的。写入速度很慢,但是读取数据很快,成本比数据库高。它几乎是依靠内存来提高性能。它目前只作为搜索引擎存在,如果你的业务涉及全文检索,那么它是你的首选之一。原文转载自《刘越的技术博客》https://v3u.cn/a_id_166