-
Установил на сайт django-sphinx настроил для работы с postgresql.
Данные индексируются через indexer,но почему-то при тесте поиска ищется только по англ словам,а русский не работает.База настроена на utf-8.
Вот конфиг:source page
{
type = pgsql
sql_host = localhost
sql_user = page
sql_pass = EzhcN5ro45
sql_db = page
sql_port =
#sql_query_pre =
#sql_query_post =
sql_query = \
SELECT id, slug, name, category_id, meta_description, meta_keywords, thumbnail, image, intro, text \
FROM page
sql_query_info = SELECT * FROM page WHERE id = $id
# ForeignKey's
#sql_attr_uint = id
sql_attr_uint = category_id
#sql_group_column = id
}
#############################################################################
## index definition
#############################################################################
index page
{
source = page
path = /var/db/sphinxsearch/data/page/page
docinfo = extern
enable_star = 1
morphology = stem_ru
#morphology = none
stopwords =
min_word_len = 3
charset_type = utf-8
#charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
min_prefix_len = 0
min_infix_len =3
} -
Я бы покопался в сторону того, какая локаль стоит у юзера, от имени которого запускается индексатор. Возможно он из базы совсем не utf-8 получает, а мусор недокодированный. Но это пока только дикие догадки...
-
И еще, я бы проверил, точно ли в utf-8 сам поисковый запрос передается.
-
Индексатор запускаю для теста из консоли.
Пишу в консоли
/usr/local/bin/indexer --config /usr/local/etc/sphinx.conf --all
и документы индексируются
Sphinx 0.9.8-release (r1371)
Copyright (c) 2001-2008, Andrew Aksyonoff
using config file '/usr/local/etc/sphinx.conf'...
indexing index 'page'...
collected 218 docs, 0.5 MB
sorted 0.0 Mhits, 100.0% done
total 218 docs, 478484 bytes
total 0.024 sec, 20178130.00 bytes/sec, 9193.27 docs/sec
Но кода пробую проверить поиск
/usr/local/bin/search --config /usr/local/etc/sphinx.conf день
Получаю вот такой ответ
Sphinx 0.9.8-release (r1371)
Copyright (c) 2001-2008, Andrew Aksyonoff
using config file '/usr/local/etc/sphinx.conf'...
index 'page': query 'день ': returned 0 matches of 0 total in 0.00 0 sec
words:
1. 'ДЕНЬ': 0 documents, 0 hits
А не могли бы намекнуть как сделать такие проверки?? -
А если из этой же консоли зайти в
psql <dbname>и сказатьselect ... where ... like '%sдень%s', что-нибудь найдется? То есть, понимает ли постгрес, запущенный из этой среды, русские буквы?Потому как сам Сфинкс судя по тому, что смог привести слово к верхнему регистру, все понимает.
-
Спасибо!
Вот попробовал как сказали,но в консоли вот такое вылезло:
"
SELECT name FROM page WHERE name LIKE '%sдень%s'\g
ERROR: пҐп╣п╡п╣я─пҐп╟я▐ п©п╬я│п╩п╣пЄп╬п╡п╟я┌п╣п╩я▄пҐп╬я│я┌я▄ п╠п╟п╧я┌ п╦п╪я▐ п╨п╬пЄп╦я─п╬п╡п╨п╦ "UTF8": 0xc4c5
ПОДСКАЗКА: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
"
Из этого можно понять что проблема с "client_encoding" решил попробовать и добавил в конфиг такую сторочку:
<code>
sql_query_pre = SET CLIENT_ENCODING TO 'UTF8'
</code>
не помогло =( -
Может
sql_query_pre = SET NAMES utf8 -
Вообще,
set namesиset client encoding to— это синонимы. Странно, что не сработало...Еще, я по привычке написал "%s" вокруг слова в like, но на самом деле оно должно быть
like '%день%'.Чтобы прочитать нормально сообщение об ошибке, стоит перед запуском консоли сказать:
export LANG=en_US.UTF-8тогда сообщения будут по-английски.
-
Пробовал вместо %s ставить % не помогло. Ошибка выдается такая же
-
Вообще, возможно оно ругается на слово "UTF8". По-правильному оно "utf-8" должно быть. Хотя у меня в обоих вариантах проходит.
-
Иван спасибо большое. я разобрался.Проблема в кодировке в консоли.Если через GET передавать слово,то все работает.Спасибо!!!
-
@linki
А не поделитесь вьюхой вывода результатов поиска? -
Еще не очень сов сем разобрался,но вот как у меня работает:
<code>
queryset = Pages.search.query(request.GET.get('q','')).all()
result = queryset.order_by('@weight')
</code>
по-умолчанию выводится 20 результатов, ка ксделать чтобы выводились все? -
У меня получилось так:
Спасибо за помощь!def search(request):
term = request.GET.get('term', '')
chapters_list = Chapter.search.query(term)
if term:
paginator = Paginator(chapters_list, 10)
try:
page = paginator.page(request.GET.get('page', '1'))
except InvalidPage:
raise Http404
else:
paginator = Paginator([], 1)
page = paginator.page(1)
return render_to_response('knigi/search.html', {
'page_obj': page,
}) -
Но нашлась проблема при использовании пагинатора. При переходе на следующую страницу к урлу должна подставляться конструкция
, а выходит что get запрос отризается. Как бы это побороть изящнее?&page=2 -
Ой, всё решилось очень просто! Передам в шаблон term, а в шаблшоне:
<a href="?term={{ term }}&page={{ page_obj.previous_page_number }}"> -
to Grigory Fateyev:
а у тебя стоит лимит на количество результатов? -
@linki
Вот здесь делается пагинация по десять объектов на страницу. Или я не о том?paginator = Paginator(chapters_list, 10) -
Нет, немного не о том.У меня если сделать вывод всех найденых запросов ,то получается всего 20



