1. linki

    19.11.2008 11:16

    Установил на сайт 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
    }
  2. Иван Сагалаев

    19.11.2008 12:34

    Я бы покопался в сторону того, какая локаль стоит у юзера, от имени которого запускается индексатор. Возможно он из базы совсем не utf-8 получает, а мусор недокодированный. Но это пока только дикие догадки...

  3. Иван Сагалаев

    19.11.2008 12:35

    И еще, я бы проверил, точно ли в utf-8 сам поисковый запрос передается.

  4. linki

    19.11.2008 13:55

    Индексатор запускаю для теста из консоли.

    Пишу в консоли
    /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

    А не могли бы намекнуть как сделать такие проверки??
  5. Иван Сагалаев

    20.11.2008 01:40

    А если из этой же консоли зайти в psql <dbname> и сказать select ... where ... like '%sдень%s', что-нибудь найдется? То есть, понимает ли постгрес, запущенный из этой среды, русские буквы?

    Потому как сам Сфинкс судя по тому, что смог привести слово к верхнему регистру, все понимает.

  6. linki

    20.11.2008 08:38

    Спасибо!
    Вот попробовал как сказали,но в консоли вот такое вылезло:
    "
    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>
    не помогло =(
  7. glader.livejournal.com

    20.11.2008 14:28

    Может
    sql_query_pre = SET NAMES utf8
  8. Иван Сагалаев

    20.11.2008 16:16

    Вообще, set names и set client encoding to — это синонимы. Странно, что не сработало...

    Еще, я по привычке написал "%s" вокруг слова в like, но на самом деле оно должно быть like '%день%'.

    Чтобы прочитать нормально сообщение об ошибке, стоит перед запуском консоли сказать:

    export LANG=en_US.UTF-8
    

    тогда сообщения будут по-английски.

  9. linki

    20.11.2008 19:14

    Пробовал вместо %s ставить % не помогло. Ошибка выдается такая же
  10. Иван Сагалаев

    20.11.2008 19:51

    Вообще, возможно оно ругается на слово "UTF8". По-правильному оно "utf-8" должно быть. Хотя у меня в обоих вариантах проходит.

  11. linki

    21.11.2008 10:41

    Иван спасибо большое. я разобрался.Проблема в кодировке в консоли.Если через GET передавать слово,то все работает.Спасибо!!!
  12. Grigory Fateyev

    21.11.2008 16:15

    @linki
    А не поделитесь вьюхой вывода результатов поиска?
  13. linki

    21.11.2008 23:28

    Еще не очень сов сем разобрался,но вот как у меня работает:
    <code>
    queryset = Pages.search.query(request.GET.get('q','')).all()
    result = queryset.order_by('@weight')
    </code>

    по-умолчанию выводится 20 результатов, ка ксделать чтобы выводились все?
  14. Grigory Fateyev

    22.11.2008 20:19

    У меня получилось так:
    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,
    })
    Спасибо за помощь!
  15. Grigory Fateyev

    22.11.2008 21:13

    Но нашлась проблема при использовании пагинатора. При переходе на следующую страницу к урлу должна подставляться конструкция
    &page=2
    , а выходит что get запрос отризается. Как бы это побороть изящнее?
  16. Grigory Fateyev

    22.11.2008 21:23

    Ой, всё решилось очень просто! Передам в шаблон term, а в шаблшоне:
    <a href="?term={{ term }}&page={{ page_obj.previous_page_number }}">
  17. linki

    25.11.2008 10:11

    to Grigory Fateyev:

    а у тебя стоит лимит на количество результатов?
  18. Grigory Fateyev

    25.11.2008 15:25

    @linki
    paginator = Paginator(chapters_list, 10)
    Вот здесь делается пагинация по десять объектов на страницу. Или я не о том?
  19. linki

    29.11.2008 12:27

    Нет, немного не о том.У меня если сделать вывод всех найденых запросов ,то получается всего 20

bbcode