У меня странная проблема с драгоценным камнем 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
. Проблема связана с этой конкретной частью!