Разделен индекс на основу (полную форму) и сокращение. Поправлено Readme с учетом новых реалий.

This commit is contained in:
Jack Stdin 2016-02-21 01:08:16 +03:00
parent 5a5c2211db
commit c4b516a28c
5 changed files with 23 additions and 16 deletions

View File

@ -26,12 +26,12 @@ Python application that can operate with FIAS (Russian Address Object DB)
### Зависимости ### Зависимости
_Внимание_! Только Python 2.7, только PostgreSQL, только Sphinx. Python 3, MySQL/MariaDB, Lucene/Solr не _Внимание_! Только Python 2.7+ (на 3+ не тестировал), только PostgreSQL, только Sphinx. MySQL/MariaDB, ElasticSearch/Solr
поддерживаются и не будут. не поддерживаются и, скорее всего, не будут.
Для работы приложения необходимо достаточное кол-во RAM (1Gb+) и 4.5Gb места на диске Для работы приложения необходимо достаточное кол-во RAM (1Gb+) и ~5.5Gb места на диске
(3-3.5Gb для скачивания архива с базой и 300-400Mb для индексов Sphinx). Также необходимы root права (3-3.5Gb для скачивания архива с базой, 350-400Mb для индексов Sphinx, 1Gb для базы). Также необходимы root права
(Администратора, для OS Windows), для работы searchd и предварительной установки. (администратора, для Windows), для работы searchd и предварительной установки.
Рекомендую устанавливать или на отдельном сервере, или на своей машине, либо же на VPS. Рекомендую устанавливать или на отдельном сервере, или на своей машине, либо же на VPS.
На shared хостинге работоспособность не гарантируется (только если хостер Вам сам все установит и настроит, На shared хостинге работоспособность не гарантируется (только если хостер Вам сам все установит и настроит,
и разрешит запуск демонов - читай: "невозможно") и разрешит запуск демонов - читай: "невозможно")
@ -83,7 +83,7 @@ _Внимание_! Только Python 2.7, только PostgreSQL, тольк
4. Web-сервер с поддержкой WSGI, любой, по Вашему желанию. 4. Web-сервер с поддержкой WSGI, любой, по Вашему желанию.
### Windows ### Windows
1. Установить lxml, через pip не ставится, так что качаем [отсюда](https://pypi.python.org/pypi/lxml/3.5.0). 1. Установить lxml, скачав [отсюда](https://pypi.python.org/pypi/lxml/3.5.0).
2. Установить unrar.exe (можно установить WinRar целиком). 2. Установить unrar.exe (можно установить WinRar целиком).
3. Установить sphinxapi последней версии (либо взять из директории Sphinx): 3. Установить sphinxapi последней версии (либо взять из директории Sphinx):
@ -147,6 +147,9 @@ _Внимание_! Только Python 2.7, только PostgreSQL, тольк
- Windows: `python manage.py -c -i C://sphinx//indexer.exe -o C://sphinx//sphinx.conf` - Windows: `python manage.py -c -i C://sphinx//indexer.exe -o C://sphinx//sphinx.conf`
- Debian: `sudo python manage.py -c -i indexer -o /usr/local/sphinx/etc/sphinx.conf` - Debian: `sudo python manage.py -c -i indexer -o /usr/local/sphinx/etc/sphinx.conf`
4. Затем запустим searchd: 4. Затем запустим searchd:
- Windows: `net start sphinxsearch`, при этом файл настройки должен быть доступен Sphinx'у. - Windows:
- Устанавливаем службу: `C:\Sphinx\bin\searchd --install --config C:\Sphinx\sphinx.conf.in --servicename sphinxsearch`
- и запускаем: `net start sphinxsearch`
- Debian: `sudo searchd --config /usr/local/sphinx/etc/sphinx.conf` - Debian: `sudo searchd --config /usr/local/sphinx/etc/sphinx.conf`
5. Настроим WSGI server, я использую nginx + passenger, Вы можете использовать любое приемлемое сочетание. 5. Настроим WSGI server, я использую nginx + passenger (см. файл passenger_wsgi.py). Вы можете использовать любое
приемлемое сочетание.

View File

@ -125,14 +125,14 @@ class SphinxSearch:
# формируем строки для поиска в Сфинксе # формируем строки для поиска в Сфинксе
for i in range(good_vars_word_count, max(0, good_vars_word_count - 3), -1): for i in range(good_vars_word_count, max(0, good_vars_word_count - 3), -1):
first_q = "\"{}\"/{}".format(" ".join(good_var.text for good_var in good_vars), i) first_q = "@fullname \"{}\"/{}".format(" ".join(good_var.text for good_var in good_vars), i)
if self.search_freq_words: if self.search_freq_words:
for j in range(freq_vars_word_count, -1, -1): for j in range(freq_vars_word_count, -1, -1):
if j == 0: if j == 0:
second_q = "" second_q = ""
else: else:
second_q = " \"{}\"/{}".format(" ".join(freq_var.text for freq_var in freq_vars), j) second_q = " @sname \"{}\"/{}".format(" ".join(freq_var.text for freq_var in freq_vars), j)
second_q = second_q.replace("*", "") second_q = second_q.replace("*", "")
print first_q + second_q print first_q + second_q

View File

@ -1,14 +1,16 @@
WITH RECURSIVE PATH (cnt, aoid, aoguid, aolevel, fullname) AS ( WITH RECURSIVE PATH (cnt, aoid, aoguid, aolevel, fullname) AS (
SELECT ao.id as cnt, ao.aoid, ao.aoguid, ao.aolevel, SELECT ao.id as cnt, ao.aoid, ao.aoguid, ao.aolevel,
ao.shortname || ' ' || ao.formalname AS fullname ao.shortname || ' ' || ao.formalname AS fullname,
ao.shortname || '' AS sname
FROM "ADDROBJ" AS ao FROM "ADDROBJ" AS ao
WHERE aolevel = 1 AND actstatus = TRUE AND livestatus = TRUE AND nextid IS NULL WHERE aolevel = 1 AND actstatus = TRUE AND livestatus = TRUE AND nextid IS NULL
UNION UNION
SELECT child.id as cnt, child.aoid, child.aoguid, child.aolevel, SELECT child.id as cnt, child.aoid, child.aoguid, child.aolevel,
PATH.fullname || ', ' || child.shortname || ' ' || child.formalname AS fullname PATH.fullname || ', ' || child.shortname || ' ' || child.formalname AS fullname,
PATH.sname || ' ' || child.shortname AS sname
FROM "ADDROBJ" AS child FROM "ADDROBJ" AS child
, PATH , PATH
WHERE child.parentguid = PATH.aoguid AND actstatus = TRUE AND livestatus = TRUE AND nextid IS NULL WHERE child.parentguid = PATH.aoguid AND actstatus = TRUE AND livestatus = TRUE AND nextid IS NULL
) )
SELECT p.cnt, p.aoid, p.fullname, length(p.fullname)-length(replace(p.fullname, ' ', '')) as wordcount FROM PATH p WHERE p.AOLEVEL NOT IN (1, 3) SELECT p.cnt, p.aoid, p.fullname, p.sname, length(p.fullname)-length(replace(p.fullname, ' ', '')) as wordcount FROM PATH p WHERE p.AOLEVEL NOT IN (1, 3)

View File

@ -10,9 +10,9 @@ source {{index_name}}
sql_query = {{!sql_query}} sql_query = {{!sql_query}}
sql_field_string = fullname sql_field_string = fullname
sql_field_string = sname
sql_attr_uint = wordcount sql_attr_uint = wordcount
sql_attr_string = aoid sql_attr_string = aoid
sql_attr_string = aoguid
} }
index {{ index_name }} index {{ index_name }}

View File

@ -33,11 +33,11 @@ searchd
# client read timeout, seconds # client read timeout, seconds
# optional, default is 5 # optional, default is 5
read_timeout = 5 read_timeout = 7
# maximum amount of children to fork (concurrent searches to run) # maximum amount of children to fork (concurrent searches to run)
# optional, default is 0 (unlimited) # optional, default is 0 (unlimited)
max_children = 30 max_children = 4
# PID file, searchd process ID file name # PID file, searchd process ID file name
# mandatory # mandatory
@ -59,5 +59,7 @@ searchd
# whether to unlink .old index copies on succesful rotation. # whether to unlink .old index copies on succesful rotation.
# optional, default is 1 (do unlink) # optional, default is 1 (do unlink)
unlink_old = 1 unlink_old = 1
expansion_limit = 48
} }