Sphinx搜索 - 多索引搜索与客户端程序汇聚

0 投票
1 回答
657 浏览
提问于 2025-04-16 23:18

我想了解如何更好地实现一个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

如果我理解得没错的话,你可以通过在你的描述索引中增加经度和纬度这两个属性,让它的工作速度更快。这样的话,你就只需要进行一次查询,而不是两次。

撰写回答