寻找实现Sphinx Search python客户端的最佳方法。
我正在搜索的数据集由配置文件内容组成。所有的配置文件在地理上组织为使用纬度和经度的位置。这些概要文件有许多不同的属性,它们都以TEXT的形式存储在数据库中,并与正确的概要文件ID相关联。基本上,从搜索的角度来看,查询过程将是发出一个地理搜索,使用Haversign查找半径范围内的所有id,然后使用Sphinx搜索所有这些属性,以查找与其发布的内容最相关的配置文件。
到目前为止,我一直在研究的sphinx客户端使用sphinx的几个不同索引,并运行单独的查询。python对象首先运行位置查询,保存在范围内的id,然后对所有其他索引运行查询,只过滤地理集中的id,以便可以作为有效结果返回。
我想知道的是,如果将位置数据加入到sphinx的全文搜索索引中,并让sphinx处理所有查询,而不是构造我的客户端程序,使用api通过这样的查询"回落",是否会更有效。一个大型索引将所有数据收集为一个sphinx"文档",而不是让客户端负责运行额外的查询和过滤,这有什么优势吗?
下面的代码给出了查询如何运行的想法:
def LocationQuery(self):
self.SetServer('127.0.0.1', 9312)
self.SetMatchMode(SPH_MATCH_ALL)
self.SetGeoAnchor('latitude','longitude',float(math.radians(self._lat)), float(math.radians(self._lon)))
self.SetLimits(0,1000)
self.SetFilterFloatRange('@geodist',float(0),self._radius,0)
self.SetSortMode(SPH_SORT_EXTENDED, '@geodist asc')
self._results = self.Query('loc', GEO_INDEX)
for match in self._results['matches']:
attrsdump = ''
for attr in self._results['attrs']:
attrname = attr[0]
attrtype = attr[1]
val = match['attrs'][attrname]
self._ids_in_range.append(ProfileResult(match['id'],match['attrs']['@geodist']))
#for obj in self._ids_in_range:
#print obj.__repr__()
def DescriptionQuery(self):
self.ResetFilters()
self.SetSortMode(SPH_SORT_EXTENDED, 'profileid_attr asc')
ids = []
for obj in self._ids_in_range:
ids.append(obj.profID)
self.SetFilter('profileid_attr', ids)
self._results = self.Query(self._query, DESCRIPTION_INDEX)
for match in self._results['matches']:
for id_valid in self._ids_in_range:
if match['id'] == id_valid.profID:
self.ResultSet.append(id_valid)
print 'Description Results: %s' % (len(self._results['matches']))
print 'Total Results: %s' % (self.ResultSet.count())
这些方法将按顺序运行,将找到的id保存到对象中。
如果我清楚地理解你,当它可以更快地工作,如果你扩展你的DESCRIPTION_INDEX与纬度和经度属性。而不是两个查询,您将只有一个描述索引。