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

10分钟纯Python搭建全文搜索引擎

时间:2023-03-25 21:40:50 Python

有群友在群里问如何快速搭建搜索引擎。经过搜索,我看到了这段代码所在的Git:https://github.com/asciimoo/s。..官方很贴心,已经提供了docker镜像,很方便。基本上拉下来就可以轻松使用了。执行命令cid=$(sudodockerps-a|grepsearx|awk'{print$1}')echosearxcidis$cidif["$cid"!=""];然后sudodockerstop$cidsudodockerrm$cidfisudodockerrun-d--namesearx-eIMAGE_PROXY=True-eBASE_URL=http://yourdomain.com-p7777:8888wonderfall/searx然后就可以使用了。正常查看docker状态,即可正常使用。想想怎么样,是不是很方便?我们先看看源码是如何实现的。下面我们打开代码的本质是聚合请求后的结果。至于数据源,我们可以来自DB,也可以来自文件。我们可以看看它的核心代码fromurllibimporturlencodefromjsonimportloadsfromcollectionsimportIterablesearch_url=Noneurl_query=Nonecontent_query=Nonetitle_query=Nonesuggestion_query=''results_query=''#支持分页的引擎的参数##每个引擎的结果数page#(仅当站点不需要设置page_size,但需要annumberoff1时才需要)第一页的编号(通常为0或1)first_page_num=1defiterate(iterable):iftype(iterable)==dict:it=iterable.iteritems()else:it=enumerate(iterable)forindex,valueyieldstr(index),valuedefis_iterable(obj):iftype(obj)==str:返回Falseiftype(obj)=unicode:返回False返回isinstance(obj,可迭代)def解析(查询):q=[]forpartinquery.split('/'):如果部分=='':继续否则:q.append(部分)返回qdefdo_query(数据,q):ret=[]如果不是q:返回retqkey=q[0]迭代数据(键,值)为:如果len(q)==1:如果key==qkey:ret.append(value)elifis_iterable(value):ret.extend(do_query(value,q))else:如果不是is_iterable(value)(value):继续:继续键==qkey:ret.extend(do_query(value,q[1:]))else:ret.ext结束(do_query(值,q))returnretdefquery(数据,query_string):q=parse(query_string)返回do_query(数据,q)defrequest(query,params):query=urlencode({'q':query})[2:]fp={'query':query}如果分页和search_url.find('{pageno}')>=0:fp['pageno']=(params['pageno']-1)*page_size+first_page_numparams['url']=search_url.format(**fp)params['query']=queryreturnparamsdefresponse(resp):results=[]json=loads(resp.text)ifresults_query:resultforquery(json,results_query)[0]:url=query(result,url_query)[0]title=query(result,title_query)[0]content=query(result,content_query)[0]sult'.':url,'title':title,'content':content})其他:对于url、标题、zip中的内容(query(json,url_query),query(json,title_query),query(json,content_query)results.append({'url':url,'title':title,'content':content})ifnotsuggestion_query:returnresultsforsuggestioninquery(json,suggestion_query):results.append({'suggestion':})returnresults每次响应返回时,我们要很方便的自定义返回的数据(可以是网络,数据库,也可以是文件),所以我们再深入思考一下。如果我们能够破解响应结果,那么我们就完全可以把自己抓取到的数据作为返回结果。如果是1024之类的,您可以创建自己的小型“爱好”引擎。我不会发布代码。你可以自己玩。结合jieba分词,可以更好玩。