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

@ -110,31 +110,28 @@ _Внимание_! Только Python 3 (для 2.7 пока есть отде
sudo apt-get install unrar sudo apt-get install unrar
``` ```
2. Устанавливаем и настраиваем libxml и виртуальное окружение: 2. Устанавливаем и настраиваем libxml:
``` ```
sudo apt-get install python3-lxml python3-dev sudo apt-get install libxml2-dev libxslt1-dev python3-dev python3-lxml
sudo pip3 install virtualenv
sudo virtualenv /opt/fias-env
source /opt/fias-env/bin/activate
``` ```
Далее будем все устанавливать внутри virtualenv'a.
3. Установить sphinxapi с поддержкой синтаксиса Python3: 3. Установить sphinxapi с поддержкой синтаксиса Python3:
``` ```
pip install https://github.com/jar3b/sphinx-py3-api/zipball/master sudo pip3 install https://github.com/jar3b/sphinx-py3-api/zipball/master
``` ```
### Общая часть: ### Общая часть:
Установим приложение из репозитория: 1. Установим приложение из репозитория:
``` ```
cd /opt/fias-env cd /var/www/
sudo mkdir -p fias-api sudo mkdir -p fias-api
sudo chown fias: /opt/fias-env/fias-api sudo chown fias: /var/www/fias-api
sudo -u fias -H git clone --branch=py3 https://github.com/jar3b/py-phias.git fias-api sudo -H -u fias git clone --branch=py3 https://github.com/jar3b/py-phias.git fias-api
cd fias-api cd fias-api
sudo pip install -r requirements.txt sudo pip3 install -r requirements.txt
``` ```
2. Иные пути установки ... (soon)
## Настройка ## Настройка
### Первоначальная настройка базы данных ### Первоначальная настройка базы данных
@ -143,9 +140,9 @@ _Внимание_! Только Python 3 (для 2.7 пока есть отде
конфигурационного файла (создается рядом с wsgi app), пример конфига находится в файле конфигурационного файла (создается рядом с wsgi app), пример конфига находится в файле
[config.example.py](config.example.py). [config.example.py](config.example.py).
2. Создадим базу: 2. Создадим базу:
- из архива `sudo -u phias python manage.py -b create -s /tmp/fias_xml.rar` - из архива `sudo -u fias python3 manage.py -b create -s /tmp/fias_xml.rar`
- из директории `sudo -u phias python manage.py -b create -s /tmp/fias_xml_unpacked` - из директории `sudo -u fias python3 manage.py -b create -s /tmp/fias_xml_unpacked`
- онлайн, с сервера ФНС `sudo -u phias python manage.py -b create -s http` - онлайн, с сервера ФНС `sudo -u fias python3 manage.py -b create -s http`
- Также, можно указать конкретную версию ФИАС олько_ при http загрузке, с ключом `--update-version <num>`, где num - - Также, можно указать конкретную версию ФИАС олько_ при http загрузке, с ключом `--update-version <num>`, где num -
номер версии ФИАС, все доступные версии можно получить, выполнив `manage.py -v`. номер версии ФИАС, все доступные версии можно получить, выполнив `manage.py -v`.
@ -156,7 +153,7 @@ _Внимание_! Только Python 3 (для 2.7 пока есть отде
указанной в `config.folders.temp`, иначе будет Permission denied при попытке bulk-import. указанной в `config.folders.temp`, иначе будет Permission denied при попытке bulk-import.
3. Проиндексируем Sphinx: 3. Проиндексируем Sphinx:
- Windows: `python manage.py -c -i C:\sphinx\bin\indexer.exe -o C:\sphinx\sphinx.conf` - Windows: `python manage.py -c -i C:\sphinx\bin\indexer.exe -o C:\sphinx\sphinx.conf`
- Debian: `sudo python manage.py -c -i indexer -o /usr/local/sphinx/etc/sphinx.conf` - Debian: `sudo python3 manage.py -c -i indexer -o /usr/local/etc/sphinx.conf`
4. Затем запустим searchd: 4. Затем запустим searchd:
- Windows: - Windows:
- Устанавливаем службу: `C:\Sphinx\bin\searchd --install --config C:\Sphinx\sphinx.conf --servicename sphinxsearch` - Устанавливаем службу: `C:\Sphinx\bin\searchd --install --config C:\Sphinx\sphinx.conf --servicename sphinxsearch`
@ -164,20 +161,23 @@ _Внимание_! Только Python 3 (для 2.7 пока есть отде
- Debian: - Debian:
- Запустим : `sudo searchd --config /usr/local/sphinx/etc/sphinx.conf` - Запустим : `sudo searchd --config /usr/local/sphinx/etc/sphinx.conf`
- если необходимо, добавьте `searchd --config /usr/local/sphinx/etc/sphinx.conf` в `/etc/rc.local` для автостарта - если необходимо, добавьте `searchd --config /usr/local/sphinx/etc/sphinx.conf` в `/etc/rc.local` для автостарта
5. Настроим WSGI server, я использую nginx + passenger. Конфиг для passenger - [passenger_wsgi.py](passenger_wsgi.py), 5. Для проверки работы выполните `sudo -H -u fias python3 passenger_wsgi.py`, по адресу `http://example.com/find/москва`
конфиг для nginx - [py-phias.conf](https://gist.github.com/jar3b/f8f5d351e0ea8ae2ed8e). Вы можете Вы должны увидеть результаты запроса.
использовать любое приемлемое сочетание.
## Api ## Api
- `/normalize/<guid>` - актуализирует AOID или AOGUID, на выходе выдает - `/normalize/<guid>` - актуализирует AOID или AOGUID, на выходе выдает
`{"aoid": "1d6185b5-25a6-4fe8-9208-e7ddd281926a"}`, где aoid - актуальный AOID. ```
- `/find/<text>` и `/find/<text>/strong`- полнотекстовый поиск по названию адресного объекта. `<text>` - строка поиска. {"aoid": "1d6185b5-25a6-4fe8-9208-e7ddd281926a"}
Если указан параметр `strong`, то поиск будет выдавать меньше результатов, но они будут точнее. Если же флаг не ```
указан, но будет выдано 10 наиболее релевантных результатов.
На выходе будет массив: , где aoid - актуальный AOID.
- `/find/<text>?strong=<0,1>`- полнотекстовый поиск по названию адресного объекта. `<text>` - строка поиска.
Если указан параметр `strong=1`, то в массиве будет один результат, или ошибка. Если же флаг не указан, но будет выдано 10
наиболее релевантных результатов.
На выходе будет массив от 1 до 10 элементов:
``` ```
[ [
{ {

View File

@ -2,7 +2,7 @@
import json import json
import logging import logging
from bottle import response from bottle import response, request
from aore.search.fiasfactory import FiasFactory from aore.search.fiasfactory import FiasFactory
from .miscutils.bottlecl import BottleCL 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'/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'/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>', self.__find)
self.add_route(r'/find/<text>/<strong>', self.__find)
self.add_error(404, self.basic_error_handler) self.add_error(404, self.basic_error_handler)
self.add_error(500, 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)) return json.dumps(self._factory.normalize(aoid))
def __find(self, text, strong=False): def __find(self, text):
strong = (strong == "strong") strong = 'strong' in request.query and request.query.strong == '1'
response.content_type = 'application/json' response.content_type = 'application/json'
response.set_header('Access-Control-Allow-Origin', '*') response.set_header('Access-Control-Allow-Origin', '*')

View File

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

View File

@ -174,18 +174,18 @@ class SphinxSearch:
cort=i)) cort=i))
# При строгом поиске нам надо еще добавить fuzzy и выбрать самое большое значение при отклонении # При строгом поиске нам надо еще добавить fuzzy и выбрать самое большое значение при отклонении
# выше заданного # выше заданного, по сути переопределяем ratio
if strong: if strong:
for result in results: 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") raise FiasException("No matches")
else: else:
return results[0] results = [results[0]]
return results return results