Sphinx搜索 - 多索引搜索与客户端程序汇聚
我想了解如何更好地实现一个Python客户端,用于Sphinx搜索。
我正在搜索的数据集是一些个人资料内容。这些个人资料根据地理位置进行组织,使用的是经度和纬度。每个个人资料都有很多不同的属性,这些属性都存储在数据库中,和对应的个人资料ID关联。简单来说,从搜索的角度来看,查询的过程是进行一次地理搜索,使用Haversine公式找到所有在某个半径内的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保存到对象中。
1 个回答
0
如果我理解得没错的话,你可以通过在你的描述索引中增加经度和纬度这两个属性,让它的工作速度更快。这样的话,你就只需要进行一次查询,而不是两次。