Some API fix:
now /find/<text>?strong=<0,1> is right route, 'find' always returns array
This commit is contained in:
parent
682200c4c1
commit
72d0036879
48
README.md
48
README.md
@ -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 элементов:
|
||||||
```
|
```
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
@ -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', '*')
|
||||||
|
|
||||||
|
@ -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))
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user