В поисках лучшего подхода к реализации клиента Python для Sphinx Search.
Набор данных, который я ищу, состоит из содержимого профиля.Все профили организованы географически как местоположения, использующие широту и долготу.Профили имеют много разных атрибутов, которые хранятся в базе данных в виде текста, связанного с правильным идентификатором профиля.По сути, процедура запроса с точки зрения поиска состояла бы в том, чтобы выполнить географический поиск, который использует Haversign, чтобы найти все идентификаторы, попадающие в радиус, а затем использовать Sphinx для поиска по всем этим свойствам, чтобы найти профили, опубликованное содержимое которых наиболее соответствуетвыданный запрос.
Клиент для sphinx, над которым я работал до сих пор, использует несколько различных индексов из sphinx и выполняет отдельные запросы.Сначала объект python выполняет запрос местоположения, сохраняет идентификаторы, попадающие в диапазон, а затем выполняет запросы ко всем остальным индексам, фильтруя только так, чтобы идентификаторы из географического набора могли быть возвращены как действительные результаты.
Что меня интересует, так это то, что было бы более эффективно объединить данные о местоположении в полнотекстовый поисковый индекс для sphinx и иметь sphinx для обработки всех запросов, а не структурировать мою клиентскую программу, которая использует 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())
Эти методы будут выполняться последовательно, сохраняя в объекте найденные идентификаторы.