Оператор SQL для извлечения текстовых данных из MySQL с повторением каждого слова в поле - PullRequest
0 голосов
/ 21 декабря 2011

Я бы хотел, чтобы SQL извлекал текстовые данные из простой таблицы MySQL, где каждое (разделенное пробелами) слово в поле удваивается / немедленно повторяется в результате.

Пример таблицы

+--------------------+
| text_data          |
+--------------------+
| The man walks.     |
| Apple pie.         |
| This is a sentence |
+--------------------+

Желаемый вывод.

+---------------------------------------+
| output                                |
+---------------------------------------+
| The The man man walks. walks.         |
| Apple Apple pie. pie.                 |
| This This is is a a sentence sentence |
+---------------------------------------+

Порядок слов важен.

Редактировать 1: Это нужно делать динамически в SQL (без временных таблиц, без php) из-за прикладного уровня (контекст является генерацией индекса в Sphinx) и постоянно меняющейся природы исходных данных.

Редактировать 2 (более подробный контекст): я хочу, чтобы функциональность wordforms в Sphinx обрабатывала определенные пары слов неразрушающим образом. То есть, если я превращу «playstation 3» в «playstation playstation 3 3», я все равно могу применить слово «playstation 3> ps3», и, по сути, статья будет доступна для поиска по запросам «playstation» и «ps3». , Если я не удваиваю , но все же применяю словоформу, тогда я теряю возможность извлекать статью, выполняя поиск по "playstation".

Ответы [ 3 ]

1 голос
/ 22 декабря 2011

Несколько вариантов ...

  1. Вы можете использовать метод индексации XMLpipe / 2 для индексации данных для сфинкса.Затем вы можете использовать произвольный (PHP и т. Д.) Код при индексации.Таким образом, вы можете использовать php для решения вашей конкретной проблемы.http://sphinxsearch.com/docs/current.html#xmlpipe2

  2. Если у вас небольшой файл wordforms, вы можете просто жестко закодировать конкретные случаи в mysql

    sql_query = SELECT id,REPLACE(text_data, 'playstation 3', 'playstation playstation 3 3') AS text_data,....
    

    (возможно, используя вложенный REPLACE (...)звонки)

    (если дело обстоит так, возможно, можно использовать UDF PREG_REPLACE)

Удвоение всех слов в любом случае кажется плохой идеей, поскольку она сломаетсяранжирование сфинксов и возможность поиска по трем + фразам (без некоторых хаков).Таким образом, используя xmlpipe, PHP может читать словоформы напрямую и только удваивать необходимые термины.

0 голосов
/ 21 декабря 2011

Вы можете написать свою собственную функцию, которая делает это. Здесь первый подход. Обратите внимание, что это всего лишь шаблон, вам нужно немного кодировать:

DROP FUNCTION IF EXISTS REPEAT_WORD
DELIMITER //
CREATE FUNCTION REPEAT_WORD(
   X TEXT
)
RETURNS TEXT
BEGIN
   DECLARE Y TEXT, PAROLE VARCHAR(255);
   WHILE INSTR( X, ' ') > 0 DO
      SET PAROLE = get first word from X
      SET Y = Y + ' ' + PAROLE + ' ' + PAROLE 
      SET X = remove PAROLE from X ...
   END WHILE;
   RETURN Y;
END
//

, затем используйте функцию выбора:

select REPEAT_WORD( text_data) as `output` 
from table
0 голосов
/ 21 декабря 2011

Я не уверен, что выбрал бы sql в качестве первого языка для этого, но если бы мне пришлось заняться этим, я бы.

  1. создала бы функцию разбиения, которая возвращает таблицу, если я неу вас уже нет одной под рукой.
  2. обновить каждую запись в таблице до слова плюс само.
  3. выбрать все записи из таблицы в объединенный результат.

Дайте мне знать, если какой-либо из этих шагов не является достаточно явным.

...