Созданный Thinking_sphinx запрос обрезает мой большой проиндексированный текст

У меня странная проблема с драгоценным камнем thinking_sphinx для Rails.

Мы индексировали содержимое документов в нашем приложении. Будь то pdf, текстовый документ или xls, мы выгружаем его содержимое непосредственно в БД, используя несколько инструментов командной строки. Этот вывод сохраняется в поле БД с именем :raw_text.

В другой модели, называемой thought, у нас есть индексный блок для think_sphinx как таковой:

define_index sphinx_index_name do
  indexes :title
  indexes :text
  ...
  indexes documents(:raw_text), :as => :thought_document_raw_text
  set_property                  :delta => :datetime, :delta_column => :updated_on, :threshold => TS_DELTA_INDEXING_THRESHOLD
  set_property                  :group_concat_max_len => 4294967295
end

Стоит отметить, что атрибут raw-text документа также индексируется в самой модели document. Все становится странно при сравнении вывода двух сгенерированных запросов, исходящих от TS.

При поиске вывода для сгенерированного TS запроса для document_core я вижу весь текст проиндексированного файла PDF. Ура! Именно то, на что я надеялся!

Если я запускаю сгенерированный TS запрос для нашей модели thought, я получаю только часть :raw_text, найденную в столбце с именем, которое мы определили в нашем индексе thought_document_raw_text.

Поскольку индекс TS для thought относится к другому document, запрос содержит некоторые элементы, связывающие эти объекты вместе.

GROUP_CONCAT(DISTINCT IFNULL('documents'.'raw_text', '0') SEPARATOR ' ') AS 'thought_document_raw_text' и LEFT OUTER JOIN 'documents' ON documents.thought_id = thoughts.id

Урезанная версия всего запроса выглядит так:

SELECT SQL_NO_CACHE 'thoughts'.'id' * 11 + 8 AS 'id' , 'thoughts'.'title' AS 'title', 'thoughts'.'text' AS 'text', GROUP_CONCAT(DISTINCT IFNULL('documents'.'filename', '0') SEPARATOR ' ') AS 'thought_document_filenames', GROUP_CONCAT(DISTINCT IFNULL('documents'.'raw_text', '0') SEPARATOR ' ') AS 'thought_document_raw_text', 'thoughts'.'id' AS 'sphinx_internal_id', CAST(IFNULL(CRC32(NULLIF('thoughts'.'type','')), 1577494256) AS UNSIGNED) AS 'class_crc', 0 AS 'sphinx_deleted' FROM 'thoughts' LEFT OUTER JOIN 'documents' ON documents.thought_id = thoughts.id GROUP BY 'thoughts'.'id', 'thoughts'.'type' ORDER BY NULL;

Когда я проверяю содержимое thought_document_raw_text, это явно не весь текст, так как размер в байтах меньше (21876 байт)

Какова цель этого отдельного в группе concat?

Каковы мои варианты, чтобы избежать создания отдельного?

Почему мой текстовый блок обрезается?

Если у кого-то была такая же проблема или аналогичная проблема с большим объемом текста, сообщите мне. Заранее спасибо!

редактировать; что я забыл упомянуть. Когда я удаляю DISTINCT из сгенерированного запроса, выходные данные совпадают с аналогичным запросом TS для document_core. Проблема связана с этой конкретной частью!


person Daniel    schedule 04.07.2011    source источник


Ответы (1)


Это проблема MySQL, но вы можете до некоторой степени настроить ее в Thinking Sphinx. В документации есть подробности.

person pat    schedule 04.07.2011
comment
Я включил параметр group_concat_max_len в свой индексный блок, хотя, похоже, это не решило мою проблему. max_allowed_packet наверняка не превышает значение по умолчанию 16 МБ. Отличным просто нужно отправиться в поход :) - person Daniel; 04.07.2011
comment
Что произойдет, если вы установите group_concat_max_len в файле sphinx.yml? - person pat; 04.07.2011