SQL语句从MySQL中检索文本数据,并重复字段中的每个单词
我希望SQL能够从一个简单的MySQL表中检索文本数据,在这个表中,字段中的每个(空格分隔的)字都会在结果中加倍/立即重复 样本表SQL语句从MySQL中检索文本数据,并重复字段中的每个单词,mysql,text,sphinx,repeat,Mysql,Text,Sphinx,Repeat,我希望SQL能够从一个简单的MySQL表中检索文本数据,在这个表中,字段中的每个(空格分隔的)字都会在结果中加倍/立即重复 样本表 +--------------------+ | text_data | +--------------------+ | The man walks. | | Apple pie. | | This is a sentence | +--------------------+ 期望输出 +----------------
+--------------------+
| 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:由于应用程序层(上下文是Sphinx中的索引生成)和源数据不断变化的性质,这必须在SQL中动态完成(没有临时表,没有php)
编辑2(更详细的上下文):我希望Sphinx中的功能以非破坏性方式处理某些单词对。也就是说,如果我将“playstation 3”转换为“playstation playstation 3 3”,我仍然可以应用单词形式“playstation 3>ps3”,并且可以通过查询“playstation”和“ps3”有效地搜索文章。如果我不加倍,但仍然使用wordform,那么我就无法通过搜索“playstation”来检索文章了。我不确定我会选择sql作为我的第一语言来做这件事,但如果我必须解决这个问题,我会这样做
如果这些步骤中的任何一个不够明确,请告诉我。您可以编写自己的函数来实现这一点。这里是第一种方法。请注意,这只是一个模板,您应该进行一些编码:
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
有几个选择
sql_query = SELECT id,REPLACE(text_data, 'playstation 3', 'playstation playstation 3 3') AS text_data,....
(可能使用嵌套的REPLACE(…)调用)
(如果案例存在问题,可能可以使用PREG_REPLACE UDF)将所有单词加倍似乎是个坏主意,因为这将破坏斯芬克斯的排名和搜索三个以上短语的能力(没有一些黑客)。因此,使用xmlpipe,PHP可以直接读取wordforms,并且只需要加倍所需的术语 在PHP这样的语言中,这将非常容易。您必须在SQL中执行此操作吗?是-编辑问题以反映这一点您可以从这开始-接受的答案有一个指向已编写的mySQL函数的链接输入翻倍的目的是什么?与您的答案相关的第一步上下文不允许在其他层中使用临时结构或处理。我的问题被编辑以反映这一点。这对你有帮助吗?完成此功能需要帮助吗?