Some API fix:

now /find/<text>?strong=<0,1> is right route,
'find' always returns array
This commit is contained in:
jar3b
2016-04-24 12:31:18 +03:00
parent 682200c4c1
commit 72d0036879
4 changed files with 35 additions and 37 deletions

View File

@@ -2,7 +2,7 @@
import json
import logging
from bottle import response
from bottle import response, request
from aore.search.fiasfactory import FiasFactory
from .miscutils.bottlecl import BottleCL
@@ -23,7 +23,6 @@ class App(BottleCL):
self.add_route(r'/normalize/<aoid:re:[\w]{8}(-[\w]{4}){3}-[\w]{12}>', self.__normalize)
self.add_route(r'/gettext/<aoid:re:[\w]{8}(-[\w]{4}){3}-[\w]{12}>', self.__gettext)
self.add_route(r'/find/<text>', self.__find)
self.add_route(r'/find/<text>/<strong>', self.__find)
self.add_error(404, self.basic_error_handler)
self.add_error(500, self.basic_error_handler)
@@ -39,8 +38,8 @@ class App(BottleCL):
return json.dumps(self._factory.normalize(aoid))
def __find(self, text, strong=False):
strong = (strong == "strong")
def __find(self, text):
strong = 'strong' in request.query and request.query.strong == '1'
response.content_type = 'application/json'
response.set_header('Access-Control-Allow-Origin', '*')

View File

@@ -46,10 +46,9 @@ class FiasFactory:
pattern = re.compile(r"[A-za-zА-Яа-я \-,.#№]+")
assert pattern.match(param), "Invalid parameter value"
# text - строка поиска
# strong - строгий поиск (True) или "мягкий" (False) (с допущением ошибок, опечаток)
# Строгий используется при импорте из внешних систем (автоматически), где ошибка критична
# text - строка поиска
# strong - строгий поиск (True) или "мягкий" (False) (с допущением ошибок, опечаток)
# Строгий используется при импорте из внешних систем (автоматически), где ошибка критична
def find(self, text, strong=False):
try:
text = urllib.parse.unquote(str(text))

View File

@@ -174,18 +174,18 @@ class SphinxSearch:
cort=i))
# При строгом поиске нам надо еще добавить fuzzy и выбрать самое большое значение при отклонении
# выше заданного
# выше заданного, по сути переопределяем ratio
if strong:
for result in results:
result['strong_rank'] = violet_ratio(text, result['text'].lower())
result['ratio'] = violet_ratio(text, result['text'].lower())
# Сортируем по убыванию признака
results.sort(key=lambda x: x['strong_rank'], reverse=True)
results.sort(key=lambda x: x['ratio'], reverse=True)
# Если подряд два одинаково релеватных результата - это плохо, на автомат такое отдавать нельзя
if abs(results[0]['strong_rank'] - results[1]['strong_rank']) == 0.0:
if abs(results[0]['ratio'] - results[1]['ratio']) == 0.0:
raise FiasException("No matches")
else:
return results[0]
results = [results[0]]
return results