@DamskiyUgodnik

Как правильно подключиться к sphinx на python3 и не иметь проблем с кодировкой?

Всем привет!
Столкнулся с проблемой отображения данных из sphinx. Проблема заключается с отображением кириллицы в консоли (именно данных которые приходят из сфинкса). Как ни странно но сходу решить проблему не получилось, гугление тоже не дало результатов. Предполагаю что где-то есть настройка из-за которого данные приходят в "неправильном" формате.

Итак, что имеем:
1. Если получаем данные (по которым строим индекс) напрямую из mysql и выводим в консоль всё ок
2. Если в консоли подключаемся к сфинксу, данные тоже выводятся нормально
3. Если подключаемся через python, получаем данные из сфинкса и выводим в консоль, получаем кракозябры.

Скрипт с простейшим запросом к сфинксу который выводит "кракозябры":

# -*- coding: utf-8 -*-
import MySQLdb, MySQLdb.cursors

sphinx_db = MySQLdb.connect(host='127.0.0.1',port=9306,user='',passwd='',db='', charset='utf8', use_unicode = True, init_command='SET NAMES UTF8')
sphinx_cursor = sphinx_db.cursor(cursorclass=MySQLdb.cursors.DictCursor)

mysql_db = MySQLdb.connect(host='127.0.0.1' ,user='*****', passwd='*****', db='*****', charset='utf8')
mysql_cursor = mysql_db.cursor(cursorclass=MySQLdb.cursors.DictCursor)

def main():
    
    # Выводит кракозябры
    sql = """SELECT * FROM documents LIMIT 1"""
    sphinx_cursor.execute(sql)
    sphinx_db.commit()
    data = sphinx_cursor.fetchone()

    print(data['text'])

    # Напрямую из mysql выводит нормально
    sql = """SELECT * FROM documents LIMIT 1"""
    mysql_cursor.execute(sql)
    mysql_db.commit()
    data = mysql_cursor.fetchone()

    print(data['text'])

if __name__ == '__main__':
    main()


Конфигурация сфинкса:

common
{
    lemmatizer_base   = /home/www/sphinx_data/dict
}
source src_documents
{
    type                = mysql
    sql_host            = localhost
    sql_user            = *****
    sql_pass            = *****
    sql_db              = *****
    sql_port            = 3306
    sql_query           = SELECT id, text FROM documents

    sql_query_pre       = SET NAMES utf8
    sql_query_pre       = SET CHARACTER SET utf8
    sql_query_pre       = SET CHARACTER_SET_RESULTS=utf8

    sql_field_string    = text

}
index documents
{
    source            = src_documents
    path              = /home/www/sphinx_data/p1
    docinfo           = extern
    charset_type      = utf-8
    morphology        = stem_en, stem_ru, soundex
    min_word_len = 3
    enable_star = 1
    min_infix_len = 3
    wordforms       = /home/www/sphinx_data/dict/words.txt
    charset_table = 0..9, A..Z->a..z, _, a..z, \
        U+410..U+42F->U+430..U+44F, U+430..U+44F, U+401->U+0435, U+451->U+0435, U+02D
}
searchd
{
  listen            = 127.0.0.1:9306:mysql41

  log               = /var/log/sphinxsearch/searchd.log
  query_log         = /var/log/sphinxsearch/query.log
  read_timeout      = 5
  max_children      = 30
  pid_file          = /home/www/sphinx_data/searchd.pid

  max_matches       = 1000
  seamless_rotate   = 1
  preopen_indexes   = 1
  unlink_old        = 1
}


Подскажите в какую сторону копать.
  • Вопрос задан
  • 583 просмотра
Решения вопроса 1
@DamskiyUgodnik Автор вопроса
Оказалось что что всё дело в особенности коннектора к базе и при коннекте нужно указывать use_unicode = False, тогда всё отрабатывает нормально, если при отображении переконвертировать данные через .decode('utf8')
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
Поставьте последнюю версию, из конфиге по идее можно убрать все про утф8
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы