django-springsteen和分布式搜索
Django(72), 老板(11), Springsteen(6)很长一段时间,我一直希望将可插拔的Django应用程序放在一起进行查询雅虎老板。本身就是这样做的很琐碎,所以应用程序需要包括某种特殊的酱汁来甜蜜的交易。我希望你能找到味道。
这是django-springsteen。(名称的信用完全是贾斯汀莉莉。)
斯普林斯特
为雅虎提供一个微不足道的包装器BOSS,但进一步提供了一个简单的构建分布式搜索网络的简单框架。如果你梦想着每个博客网络可以搜索的世界,并且每个利基都有自己的垂直搜索,那么斯普林斯特
是给你的。
让我们从一些例子开始。
查询BOSS for Web结果
斯普林斯特
搜索雅虎的预建观点BOSS for Web,图像和新闻结果,使这是最简单的Usecase。
从django.conf.urls.defaults.进口*从springsteen.views.进口网页那图片那消息URLPatterns.=图案(''那(r'^ search / web / $'那网页),(r'^搜索/图像/ $'那图片),(r'^搜索/新闻/ $'那消息),)
然后导航到http://yourproject.com/search/web/
(或者/搜索/图像/
或者/搜索/新闻/
你会立即有一个搜索页面等着你。
搜索结果网页
- 以及所有实现的服务 - 使用您的缓存后端缓存settings.py.
文件。缓存雅虎的速度好处!BOSS可能相当少,但对于更多异国服务(和频繁搜索),缓存可能会成为一个功能。
清理外观覆盖springsteen / base.html.
或者springsteen /结果.html.
模板。(你也可以覆盖* _result.html.
模板以自定义不同的结果类型。)
BOSS结果与网站限制
如果您只希望在单个站点上的Web结果(穷人的网站搜索),则可以将其子类化springsteen.services.web.
类(你可以通过对这些来限制新闻或图像来分类springsteen.services.news.
和springsteen.services.images.
分别为课程)。
首先是子类化。
从springsteen.services.进口网页班级djangoprojectsearch.(网页):def在里面(自己那询问那参数={}):极好的(网页那自己)。在里面(询问那参数)自己。参数['网站']='djangoproject.com'
您也可以添加其他参数,也可以添加其他参数在雅虎定义了老板文件。
在编写自定义搜索后,然后写一个使用它的视图。
从springsteen.views.进口搜索从my_searches.进口djangoprojectsearch.defdp_search.(要求那超时=2000年那max_count.=5.那
服务=(djangoprojectsearch.,),extra_params.={}):返回搜索(要求那超时那max_count.那服务那extra_params.)
并行查询多个服务
我作为Web开发人员制作的频繁错误之一是在可以同时完成时顺序地使HTTP请求顺序。斯普林斯特
旨在聚合许多搜索服务,因此它需要能够并行请求和处理它们。
要执行并发请求只是指定多个服务。(请注意,下面定义的值设置
不是标准,但是你能够把它们放在你的settings.py.
如果这是你喜欢组织全局的话。)
从django.conf.进口设置从springsteen.services.进口网页那图片从springsteen.views.进口搜索defmy_search.(要求):超时=设置。springsteen_timeout.max_count.=结算。springsteen_max_count.服务=(网页那图片)返回搜索(要求那超时那max_count.那服务)
默认情况下,服务的结果彼此堆叠。例如,由上面的结果my_search.
会返回所有结果图片
然后开始显示结果网页
。
排名结果是搜索中最难的部分,并且斯普林斯特
不会解决这个问题。相反,它会给你杠杆自己。对于大多数小规模情况,应该可以编写相当简洁的排名逻辑,具体对您查询的服务,这将优于任何通用天才斯普林斯特
可能会尝试提供。
通过a曝光结果Springsteen服务
因为斯普林斯特
全部是关于聚合搜索服务,它将逐步扩展以了解新格式。但是,有时您只想将新数据曝光到斯普林斯特
,并尚未确定格式。
对于那些情况,您可以使用SpringSteen服务。抛开酷的名称,他们就像它一样简单。让我们想象一下,你可以以某种方式获得CSV格式的搜索结果(否它没有意义,这是一个例子)。
也许你的数据看起来像这样:
标题,URL,Text ABC,http:// yadayad / abc /,这里的一些文本efg,http:// yadayad / efg /,这里的一些文字
你有一个功能CSV_Search.
返回相关行。您可以通过SpringSteen服务公开,如下所示。
从CSV进口Dictreader.从fake_web_service.进口CSV_Search.从django.utils.进口简单json.从springsteen.views.进口服务defRetrieve_csv_results.(询问那开始那数数):csv_results.那Total_Results.=CSV_Search.(询问那开始那数数)结果=[]为了线在Dictreader.(csv_results.):结果={'标题':线['标题'],'URL':线['URL'],'文本':线['文本'],}结果。附加(结果)数据={'total_results':Total_Results.那'结果':结果那}返回简单json.。倾倒(数据)
defmy_service.(要求):返回服务(要求那Retrieve_func.=Retrieve_csv_results.)
此时,Springsteen服务的唯一三个确认字段是上面的标题
那URL.
和文本
。由于需要归路,可以充实标准以容纳额外的元数据。
而不是假设CSV_Search.
,您可以使用这种方法将Solango或Django-Sphinx结果包装,以及在生态系统中的非Django API或服务路由。
搜索API中继器和变压器
假设您想要为博客实施网站搜索API,但没有“工程资源”,以集成Solango或Django-Sphinx等解决方案。
首先,我们需要子类网页
获得我们网站的结果。
从springsteen.services.进口网页班级mysiteService.(网页):def在里面(自己那询问那参数={}):极好的(网页那自己)。在里面(询问那参数)自己。参数['网站']='www.klytx.com'
然后我们需要揭露结果。
从django.http.进口httpresponse.从springsteen.views.进口服务从django.utils.进口简单json.从某处进口mysiteService.defRetrieve_func.(询问那开始那数数):参数={'开始':开始那'数数':数数}MSS.=mysiteService.(询问那参数)MSS.。跑步()结果=MSS.。结果()杰森=简单json.。倾倒(结果)返回httpresponse.(杰森那mimetype.=“application / json”)
现在是雅虎!BOSS结果以SpringSteen服务格式转换,可以通过外部预测地验证斯普林斯特
搜索。
检索结果Springsteen服务
从SpringSteen服务中检索结果很简单,类似于检索雅虎!老板结果。
从springsteen.services.进口springsteenservice.那网页从springsteen.views.进口搜索班级myservice.(springsteenservice.):_URI.=“http://example.com/search/cvs/”
defmy_search.(要求那超时=2500那max_count.=20.):服务=(myservice.那网页)返回搜索(要求那超时那max_count.那服务)
斯普林斯特
已经知道如何从SpringSteen服务中显示结果,因此集成相当简洁。
访问自定义服务
当您可以获得合作伙伴以您想要的格式公开服务时,它总是最容易的(在这种情况下,springsteenservice.
),但有时你必须进入那里并自己解析数据。
在springsteen.services.
这俩springsteenservice.
和Bosssearch.
类提供了以不同的数据格式接口的示例。
关键点是写一个跑步
检索结果并将其转换为词典列表的方法。如果要使用现有的模板片段(Web,News,Image或SpringSteen结果之一呈现它们,那么您应该将相应的值添加到来源
每个结果字典的键。
def跑步(自己):东西那Total_Results.=get_results.(自己。询问那自己。参数)结果=简单json.。负荷(东西)为了结果在结果:结果['来源']='web'自己。_结果=结果自己。Total_Results.=Total_Results.
让我知道是否证明了遵循现有结果的挑战,我很乐意提供一个完整的子类演练服务
和cachableAvice.
。
未来斯普林斯特
目前核心斯普林斯特
几乎完整,我只需要稍微重新推荐,以方便插入自定义排名逻辑。除此之外,还有一个无限数量的服务斯普林斯特
想知道如何查询和显示。
通过SpringSeen服务以及查询和聚合结果,有一个工作示例,并希望它将充分地由此揭示即将到来的星期一。
我希望斯普林斯特
它对小型玩家的分布式搜索的愿景是您发现令人兴奋的东西,我知道我对创建有针对性的和相关搜索框的前景令人兴奋,而相关的搜索框不受数据中心中的数千个商品服务器,而是由我的vps,而且你的。
下载
django-springsteen可在github上使用。
git clone git@github.com:终身/ django-springsteen.git
我们都是忙碌的人,但你非常欢迎加入发展!