Задать вопрос
@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
}


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

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

Похожие вопросы