У меня странная проблема с гемом thinking_sphinx
для Rails.
Мы индексируем содержимое документов в нашем приложении.Будь то PDF, Word Document или 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?
Какие у меня есть вариантыизбежать создания различимых?
Почему мой текстовый блоб обрезается?
Если у кого-то была такая же проблема или какая-то похожая проблема с большим объемом текста, пожалуйста, дайте мне знать.Заранее спасибо!
edit;что я забыл упомянуть.Когда я удаляю DISTINCT из сгенерированного запроса, вывод совпадает с его запросом TS для document_core
.Проблема связана с этой конкретной частью!