Разделен индекс на основу (полную форму) и сокращение. Поправлено Readme с учетом новых реалий.
This commit is contained in:
parent
5a5c2211db
commit
c4b516a28c
19
README.md
19
README.md
@ -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). Вы можете использовать любое
|
||||||
|
приемлемое сочетание.
|
@ -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
|
||||||
|
@ -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)
|
@ -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 }}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user