Bringen Sie Ihnen Schritt für Schritt bei, wie Sie mit Flask eine ES-Suchmaschine erstellen (vorbereitender Teil)

Freigeben: 2023-07-25 17:27:28
nach vorne
923 Leute haben es durchsucht

/1 Vorwort/

Elasticsearch ist eine Open-Source-Suchmaschine, die auf einer Volltextsuchmaschinenbibliothek aufbautApache Lucene™Basierend auf den Grundlagen.


Bringen Sie Ihnen Schritt für Schritt bei, wie Sie mit Flask eine ES-Suchmaschine erstellen (vorbereitender Teil)

So implementieren Sie

Elasticsearchund.Pyth am Das Andocken vonist für uns zu einem Problem geworden (warum haben wir das? um alles zu verbinden? Python bezogen).

/2 Python-Interaktion/

Also,PythonEs stellt außerdem Abhängigkeitsbibliotheken bereit, die mitElasticsearchverbunden werden können.


pip install elasticsearch
Nach dem Login kopieren


Initialisieren Sie eine Verbindung zu einemElasticsearchOperationsobjekt.

def __init__(self, index_type: str, index_name: str, ip="127.0.0.1"): # self.es = Elasticsearch([ip], http_auth=('username', 'password'), port=9200) self.es = Elasticsearch("localhost:9200") self.index_type = index_type self.index_name = index_name
Nach dem Login kopieren

Der Standardport ist9200Bitte stellen Sie vor der Initialisierung sicher, dass die lokale Umgebung vonElasticsearcheingerichtet wurde.

Dokumentdaten basierend auf der ID abrufen


def get_doc(self, uid): return self.es.get(index=self.index_name, id=uid)
Nach dem Login kopieren


插入文档数据


def insert_one(self, doc: dict): self.es.index(index=self.index_name, doc_type=self.index_type, body=doc) def insert_array(self, docs: list): for doc in docs: self.es.index(index=self.index_name, doc_type=self.index_type, body=doc)
Nach dem Login kopieren


搜索文档数据


def search(self, query, count: int = 30): dsl = { "query": { "multi_match": { "query": query, "fields": ["title", "content", "link"] } }, "highlight": { "fields": { "title": {} } } } match_data = self.es.search(index=self.index_name, body=dsl, size=count) return match_data def __search(self, query: dict, count: int = 20): # count: 返回的数据大小 results = [] params = { 'size': count } match_data = self.es.search(index=self.index_name, body=query, params=params) for hit in match_data['hits']['hits']: results.append(hit['_source']) return results
Nach dem Login kopieren

删除文档数据


def delete_index(self): try: self.es.indices.delete(index=self.index_name) except: pass
Nach dem Login kopieren

好啊,封装search类也是为了方便调用,整体贴一下。

from elasticsearch import Elasticsearch class elasticSearch(): def __init__(self, index_type: str, index_name: str, ip="127.0.0.1"): # self.es = Elasticsearch([ip], http_auth=('elastic', 'password'), port=9200) self.es = Elasticsearch("localhost:9200") self.index_type = index_type self.index_name = index_name def create_index(self): if self.es.indices.exists(index=self.index_name) is True: self.es.indices.delete(index=self.index_name) self.es.indices.create(index=self.index_name, ignore=400) def delete_index(self): try: self.es.indices.delete(index=self.index_name) except: pass def get_doc(self, uid): return self.es.get(index=self.index_name, id=uid) def insert_one(self, doc: dict): self.es.index(index=self.index_name, doc_type=self.index_type, body=doc) def insert_array(self, docs: list): for doc in docs: self.es.index(index=self.index_name, doc_type=self.index_type, body=doc) def search(self, query, count: int = 30): dsl = { "query": { "multi_match": { "query": query, "fields": ["title", "content", "link"] } }, "highlight": { "fields": { "title": {} } } } match_data = self.es.search(index=self.index_name, body=dsl, size=count) return match_data
Nach dem Login kopieren

尝试一下把Mongodb中的数据插入到ES中。

import json from datetime import datetime import pymongo from app.elasticsearchClass import elasticSearch client = pymongo.MongoClient('127.0.0.1', 27017) db = client['spider'] sheet = db.get_collection('Spider').find({}, {'_id': 0, }) es = elasticSearch(index_type="spider_data",index_name="spider") es.create_index() for i in sheet: data = { 'title': i["title"], 'content':i["data"], 'link': i["link"], 'create_time':datetime.now() } es.insert_one(doc=data)
Nach dem Login kopieren

ES中查看一下,启动elasticsearch-head插件。

如果是npm安装的那么 cd 到根目录之后直接npm run start就跑起来了。

本地访问http://localhost:9100/

Bringen Sie Ihnen Schritt für Schritt bei, wie Sie mit Flask eine ES-Suchmaschine erstellen (vorbereitender Teil)

发现新加的spider数据文档确实已经进去了。

/3 爬虫入库/

要想实现ES搜索,首先要有数据支持,而海量的数据往往来自爬虫。

为了节省时间,编写一个最简单的爬虫,抓取百度百科

简单粗暴一点,先递归获取很多很多的url 链接



把全部 url 存到url.txt文件中之后,然后启动任务。


# parse.py from celery import Celery import requests from lxml import etree import pymongo app = Celery('tasks', broker='redis://localhost:6379/2') client = pymongo.MongoClient('localhost',27017) db = client['baike'] @app.task def get_url(link): item = {} headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'} res = requests.get(link,headers=headers) res.encoding = 'UTF-8' doc = etree.HTML(res.text) content = doc.xpath("//div[@class='lemma-summary']/div[@class='para']//text()") print(res.status_code) print(link,'\t','++++++++++++++++++++') item['link'] = link data = ''.join(content).replace(' ', '').replace('\t', '').replace('\n', '').replace('\r', '') item['data'] = data if db['Baike'].insert(dict(item)): print("is OK ...") else: print('Fail')
Nach dem Login kopieren

run.py飞起来


from parse import get_url def main(url): result = get_url.delay(url) return result def run(): with open('./url.txt', 'r') as f: for url in f.readlines(): main(url.strip('\n')) if __name__ == '__main__': run()
Nach dem Login kopieren


黑窗口键入


celery -A parse worker -l info -P gevent -c 10
Nach dem Login kopieren

哦豁 !! 你居然使用了Celery任务队列,gevent模式,-c 就是10个线程刷刷刷就干起来了,速度杠杠的 !!

啥?分布式? 那就加多几台机器啦,直接把代码拷贝到目标服务器,通过redis共享队列协同多机抓取。

这里是先将数据存储到了MongoDB上(个人习惯),你也可以直接存到 ES 中,但是单条单条的插入速度堪忧(接下来会讲到优化,哈哈)。

使用前面的例子将Mongo中的数据批量导入到ES中,OK !!!

Bringen Sie Ihnen Schritt für Schritt bei, wie Sie mit Flask eine ES-Suchmaschine erstellen (vorbereitender Teil)

到这一个简单的数据抓取就已经完毕了。

好啦,现在ES中已经有了数据啦,接下来就应该是Flaskweb 的操作啦,当然,DjangoFastAPI也很优秀。嘿嘿,你喜欢 !!

关于FastAPI的文章可以看这个系列文章:

1、(入门篇)简析Python web框架FastAPI——一个比Flask和Tornada更高性能的API 框架

2、(进阶篇)Python web框架FastAPI——一个比Flask和Tornada更高性能的API 框架

3、(完结篇)Python web框架FastAPI——一个比Flask和Tornada更高性能的API 框架

/4 Flask 项目结构/

Bringen Sie Ihnen Schritt für Schritt bei, wie Sie mit Flask eine ES-Suchmaschine erstellen (vorbereitender Teil)


这样一来前期工作就差不多了,接下来剩下的工作主要集中于Flask的实际开发中,蓄力中 !!

Das obige ist der detaillierte Inhalt vonBringen Sie Ihnen Schritt für Schritt bei, wie Sie mit Flask eine ES-Suchmaschine erstellen (vorbereitender Teil). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:Go语言进阶学习
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!