Улучшена обработка результатов
This commit is contained in:
parent
586768b315
commit
4d565e5808
@ -21,33 +21,39 @@ class SphinxSearch:
|
|||||||
self.regression_coef = 0.04
|
self.regression_coef = 0.04
|
||||||
|
|
||||||
self.db = DBImpl(psycopg2, dbparams)
|
self.db = DBImpl(psycopg2, dbparams)
|
||||||
self.client = sphinxapi.SphinxClient()
|
|
||||||
self.client.SetServer("localhost", 9312)
|
|
||||||
self.client.SetLimits(0, 10)
|
|
||||||
|
|
||||||
self.client1 = sphinxapi.SphinxClient()
|
self.client_sugg = sphinxapi.SphinxClient()
|
||||||
self.client1.SetServer("localhost", 9312)
|
self.client_sugg.SetServer("localhost", 9312)
|
||||||
self.client1.SetLimits(0, 10)
|
self.client_sugg.SetLimits(0, 10)
|
||||||
self.client1.SetConnectTimeout(7.0)
|
self.client_sugg.SetConnectTimeout(3.0)
|
||||||
|
|
||||||
|
self.client_show = sphinxapi.SphinxClient()
|
||||||
|
self.client_show.SetServer("localhost", 9312)
|
||||||
|
self.client_show.SetLimits(0, 10)
|
||||||
|
self.client_show.SetConnectTimeout(3.0)
|
||||||
|
|
||||||
def __configure(self, index_name, wlen=None):
|
def __configure(self, index_name, wlen=None):
|
||||||
if index_name == "idx_fias_sugg":
|
if index_name == "idx_fias_sugg":
|
||||||
if wlen:
|
if wlen:
|
||||||
self.client.SetMatchMode(sphinxapi.SPH_MATCH_EXTENDED2)
|
self.client_sugg.SetMatchMode(sphinxapi.SPH_MATCH_EXTENDED2)
|
||||||
self.client.SetRankingMode(sphinxapi.SPH_RANK_WORDCOUNT)
|
self.client_sugg.SetRankingMode(sphinxapi.SPH_RANK_WORDCOUNT)
|
||||||
self.client.SetFilterRange("len", int(wlen) - self.delta_len, int(wlen) + self.delta_len)
|
self.client_sugg.SetFilterRange("len", int(wlen) - self.delta_len, int(wlen) + self.delta_len)
|
||||||
self.client.SetSelect("word, len, @weight+{}-abs(len-{}) AS krank".format(self.delta_len, wlen))
|
self.client_sugg.SetSelect("word, len, @weight+{}-abs(len-{}) AS krank".format(self.delta_len, wlen))
|
||||||
self.client.SetSortMode(sphinxapi.SPH_SORT_EXTENDED, "krank DESC")
|
self.client_sugg.SetSortMode(sphinxapi.SPH_SORT_EXTENDED, "krank DESC")
|
||||||
|
else:
|
||||||
|
self.client_show.SetMatchMode(sphinxapi.SPH_MATCH_EXTENDED2)
|
||||||
|
self.client_show.SetRankingMode(sphinxapi.SPH_RANK_BM25)
|
||||||
|
|
||||||
def __get_suggest(self, word, rating_limit, count):
|
def __get_suggest(self, word, rating_limit, count):
|
||||||
word_len = str(len(word) / 2)
|
word_len = str(len(word) / 2)
|
||||||
trigrammed_word = '"{}"/1'.format(trigram(word))
|
trigrammed_word = '"{}"/1'.format(trigram(word))
|
||||||
|
|
||||||
self.__configure(sphinx_index_sugg, word_len)
|
self.__configure(sphinx_index_sugg, word_len)
|
||||||
result = self.client.Query(trigrammed_word, sphinx_index_sugg)
|
result = self.client_sugg.Query(trigrammed_word, sphinx_index_sugg)
|
||||||
|
|
||||||
# Если по данному слову не найдено подсказок (а такое бывает?)
|
# Если по данному слову не найдено подсказок (а такое бывает?)
|
||||||
# возвращаем []
|
# возвращаем []
|
||||||
|
|
||||||
if not result['matches']:
|
if not result['matches']:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
@ -90,7 +96,6 @@ class SphinxSearch:
|
|||||||
if word_entry.MT_ADD_SOCR:
|
if word_entry.MT_ADD_SOCR:
|
||||||
word_entry.add_variation_socr()
|
word_entry.add_variation_socr()
|
||||||
|
|
||||||
|
|
||||||
def __get_word_entries(self, words):
|
def __get_word_entries(self, words):
|
||||||
for word in words:
|
for word in words:
|
||||||
if word != '':
|
if word != '':
|
||||||
@ -98,17 +103,15 @@ class SphinxSearch:
|
|||||||
self.__add_word_variations(we)
|
self.__add_word_variations(we)
|
||||||
yield we
|
yield we
|
||||||
|
|
||||||
|
|
||||||
def find(self, text):
|
def find(self, text):
|
||||||
words = self.__split_phrase(text)
|
words = self.__split_phrase(text)
|
||||||
word_entries = self.__get_word_entries(words)
|
word_entries = self.__get_word_entries(words)
|
||||||
sentence = "{}".format(" MAYBE ".join(x.get_variations() for x in word_entries))
|
sentence = "{}".format(" MAYBE ".join(x.get_variations() for x in word_entries))
|
||||||
#self.__configure(sphinx_index_addjobj)
|
|
||||||
self.client1.SetMatchMode(sphinxapi.SPH_MATCH_EXTENDED2)
|
self.__configure(sphinx_index_addjobj)
|
||||||
self.client1.SetRankingMode(sphinxapi.SPH_RANK_SPH04)
|
rs = self.client_show.Query(sentence, sphinx_index_addjobj)
|
||||||
#self.client1.SetF
|
|
||||||
rs = self.client1.Query(sentence, sphinx_index_addjobj)
|
results = []
|
||||||
print rs
|
|
||||||
for ma in rs['matches']:
|
for ma in rs['matches']:
|
||||||
print ma['attrs']['fullname'], ma['weight']
|
results.append([ma['attrs']['aoid'], ma['attrs']['fullname'], ma['weight']])
|
||||||
print sentence
|
print results
|
||||||
|
@ -46,7 +46,6 @@ class WordEntry:
|
|||||||
self.scname = None
|
self.scname = None
|
||||||
self.ranks = self.__get_ranks()
|
self.ranks = self.__get_ranks()
|
||||||
|
|
||||||
|
|
||||||
for x, y in self.match_types.iteritems():
|
for x, y in self.match_types.iteritems():
|
||||||
self.__dict__[x] = False
|
self.__dict__[x] = False
|
||||||
for z in y:
|
for z in y:
|
||||||
@ -63,8 +62,6 @@ class WordEntry:
|
|||||||
self.variations.append(variation_string)
|
self.variations.append(variation_string)
|
||||||
|
|
||||||
def get_variations(self):
|
def get_variations(self):
|
||||||
#if len(self.variations) == 1:
|
|
||||||
# return "\"{}\"".format(self.variations[0])
|
|
||||||
return "({})".format(" | ".join(self.variations))
|
return "({})".format(" | ".join(self.variations))
|
||||||
|
|
||||||
def __get_ranks(self):
|
def __get_ranks(self):
|
||||||
|
@ -2,4 +2,6 @@ CREATE INDEX "sphinx_ind_aolevel" ON "ADDROBJ" USING btree ("aolevel");
|
|||||||
CREATE INDEX "sphinx_ind_parentguid" ON "ADDROBJ" USING btree ("parentguid");
|
CREATE INDEX "sphinx_ind_parentguid" ON "ADDROBJ" USING btree ("parentguid");
|
||||||
CREATE INDEX "sphinx_ind_livestatus" ON "ADDROBJ" USING btree ("livestatus");
|
CREATE INDEX "sphinx_ind_livestatus" ON "ADDROBJ" USING btree ("livestatus");
|
||||||
CREATE INDEX "sphinx_ind_aoguid" ON "ADDROBJ" USING btree ("aoguid");
|
CREATE INDEX "sphinx_ind_aoguid" ON "ADDROBJ" USING btree ("aoguid");
|
||||||
|
CREATE INDEX "SOCRBASE_scname_idx" ON "SOCRBASE" USING btree ("scname");
|
||||||
|
CREATE INDEX "SOCRBASE_socrname_idx" ON "SOCRBASE" USING btree ("socrname");
|
||||||
CREATE INDEX "AOTRIG_word_idx" ON "AOTRIG" USING btree ("word");
|
CREATE INDEX "AOTRIG_word_idx" ON "AOTRIG" USING btree ("word");
|
||||||
|
@ -54,7 +54,7 @@ def main():
|
|||||||
# 4 Debug purposes..
|
# 4 Debug purposes..
|
||||||
if options.test:
|
if options.test:
|
||||||
sph = SphinxSearch()
|
sph = SphinxSearch()
|
||||||
sph.find('#москва$#северное тушино$$$ул#туристская')
|
sph.find('кридовая паскаул')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user