2011-08-10 166 views
0

尋找洞察實現Sphinx搜索的python客戶端的最佳方法。Sphinx搜索 - 多索引搜索vs客戶端程序聚合

我正在搜索的數據集由配置文件內容組成。所有的配置文件都按地理位置組織成使用緯度和經度的位置。配置文件具有許多不同的屬性,所有屬性均以與正確的配置文件ID關聯的TEXT存儲在數據庫中。基本上,從搜索的角度來看,查詢過程就是發佈一個使用Haversign的地理搜索來查找屬於半徑範圍內的所有ID,然後使用Sphinx搜索所有這些屬性來查找發佈內容與發出查詢。

到目前爲止,我一直在努力的sphinx客戶端使用了幾個不同的sphinx索引,並運行不同的查詢。 python對象首先運行位置查詢,保存屬於範圍內的id,然後針對所有其他索引運行查詢,只進行過濾,以便可以將地理集中的id作爲有效結果返回。

我想知道的是,如果將位置數據加入到獅身人面像的全文搜索索引中並讓獅身人面像處理所有的查詢,而不是構造使用api「客戶端」的客戶端程序,通過這樣的查詢。對於一個將所有數據作爲一個獅身人面像「文檔」收集的大型索引,而不是讓客戶端負責運行額外的查詢和過濾,會有什麼好處嗎?

代碼貼在下面給出的查詢如何運行一個想法:

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。

回答

0

如果我理解你的清楚,它可以更快的工作,如果你擴展你的DESCRIPTION_INDEX經度和緯度屬性。 而不是兩個查詢,你將只有一個描述索引。