diff --git a/README.md b/README.md index a263f87..a8277c0 100644 --- a/README.md +++ b/README.md @@ -110,31 +110,28 @@ _Внимание_! Только Python 3 (для 2.7 пока есть отде sudo apt-get install unrar ``` -2. Устанавливаем и настраиваем libxml и виртуальное окружение: +2. Устанавливаем и настраиваем libxml: ``` - sudo apt-get install python3-lxml python3-dev - sudo pip3 install virtualenv - sudo virtualenv /opt/fias-env - source /opt/fias-env/bin/activate + sudo apt-get install libxml2-dev libxslt1-dev python3-dev python3-lxml ``` - Далее будем все устанавливать внутри virtualenv'a. 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 chown fias: /opt/fias-env/fias-api - sudo -u fias -H git clone --branch=py3 https://github.com/jar3b/py-phias.git fias-api + sudo chown fias: /var/www/fias-api + sudo -H -u fias git clone --branch=py3 https://github.com/jar3b/py-phias.git 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), пример конфига находится в файле [config.example.py](config.example.py). 2. Создадим базу: - - из архива `sudo -u phias python manage.py -b create -s /tmp/fias_xml.rar` - - из директории `sudo -u phias python 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 /tmp/fias_xml.rar` + - из директории `sudo -u fias python3 manage.py -b create -s /tmp/fias_xml_unpacked` + - онлайн, с сервера ФНС `sudo -u fias python3 manage.py -b create -s http` - Также, можно указать конкретную версию ФИАС _только_ при http загрузке, с ключом `--update-version `, где num - номер версии ФИАС, все доступные версии можно получить, выполнив `manage.py -v`. @@ -156,7 +153,7 @@ _Внимание_! Только Python 3 (для 2.7 пока есть отде указанной в `config.folders.temp`, иначе будет Permission denied при попытке bulk-import. 3. Проиндексируем Sphinx: - 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: - Windows: - Устанавливаем службу: `C:\Sphinx\bin\searchd --install --config C:\Sphinx\sphinx.conf --servicename sphinxsearch` @@ -164,20 +161,23 @@ _Внимание_! Только Python 3 (для 2.7 пока есть отде - Debian: - Запустим : `sudo searchd --config /usr/local/sphinx/etc/sphinx.conf` - если необходимо, добавьте `searchd --config /usr/local/sphinx/etc/sphinx.conf` в `/etc/rc.local` для автостарта -5. Настроим WSGI server, я использую nginx + passenger. Конфиг для passenger - [passenger_wsgi.py](passenger_wsgi.py), -конфиг для nginx - [py-phias.conf](https://gist.github.com/jar3b/f8f5d351e0ea8ae2ed8e). Вы можете -использовать любое приемлемое сочетание. +5. Для проверки работы выполните `sudo -H -u fias python3 passenger_wsgi.py`, по адресу `http://example.com/find/москва` +Вы должны увидеть результаты запроса. ## Api - `/normalize/` - актуализирует AOID или AOGUID, на выходе выдает - `{"aoid": "1d6185b5-25a6-4fe8-9208-e7ddd281926a"}`, где aoid - актуальный AOID. -- `/find/` и `/find//strong`- полнотекстовый поиск по названию адресного объекта. `` - строка поиска. -Если указан параметр `strong`, то поиск будет выдавать меньше результатов, но они будут точнее. Если же флаг не -указан, но будет выдано 10 наиболее релевантных результатов. + ``` + {"aoid": "1d6185b5-25a6-4fe8-9208-e7ddd281926a"} + ``` - На выходе будет массив: + , где aoid - актуальный AOID. +- `/find/?strong=<0,1>`- полнотекстовый поиск по названию адресного объекта. `` - строка поиска. +Если указан параметр `strong=1`, то в массиве будет один результат, или ошибка. Если же флаг не указан, но будет выдано 10 +наиболее релевантных результатов. + + На выходе будет массив от 1 до 10 элементов: ``` [ { diff --git a/aore/phias.py b/aore/phias.py index 8c4ca9e..1f7897a 100644 --- a/aore/phias.py +++ b/aore/phias.py @@ -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/', self.__normalize) self.add_route(r'/gettext/', self.__gettext) self.add_route(r'/find/', self.__find) - self.add_route(r'/find//', 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', '*') diff --git a/aore/search/fiasfactory.py b/aore/search/fiasfactory.py index f09becb..4afb42d 100644 --- a/aore/search/fiasfactory.py +++ b/aore/search/fiasfactory.py @@ -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)) diff --git a/aore/search/search.py b/aore/search/search.py index 30e87d5..20d5a8d 100644 --- a/aore/search/search.py +++ b/aore/search/search.py @@ -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