Sphinx搜索-多索引搜索vs客户端程序聚合



寻找实现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与纬度和经度属性。而不是两个查询,您将只有一个描述索引。

最新更新