从MySQL中的文本字段中选择X个单词

时间:2008-09-01 15:08:13

标签: mysql

我正在构建一个基本的搜索功能,使用LIKE(我将使用全文但目前不能)并且我想知道MySQL是否可以,在搜索关键字时(例如WHERE字段LIKE'%单词%')在关键字的任一侧返回20个单词?

4 个答案:

答案 0 :(得分:2)

您可以使用SUBSTRING_INDEX

在查询中完成所有操作
CONCAT_WS(
' ',
-- 20 words before
TRIM(
    SUBSTRING_INDEX(
        SUBSTRING(field, 1, INSTR(field, 'word') - 1 ),
        ' ',
        -20
    )
),
-- your word
'word',
-- 20 words after
TRIM(
    SUBSTRING_INDEX(
        SUBSTRING(field, INSTR(field, 'word') + LENGTH('word') ),
        ' ',
        20
    )
)

答案 1 :(得分:0)

使用INSTR()函数查找字符串中单词的位置,然后使用SUBSTRING()函数选择位置前后字符的一部分。

你必须注意你的SUBSTRING指令不使用负值,否则你会得到奇怪的结果。

试试,并报告回来。

答案 2 :(得分:0)

我认为不可能限制返回的字数,但是为了限制返回的字符数,你可以做类似的事情

SELECT SUBSTRING(field_name, LOCATE('keyword', field_name) - chars_before, total_chars) FROM table_name WHERE field_name LIKE "%keyword%"
  • chars_before - 是数字 你希望在之前选择的字符 关键字(S)
  • total_chars - 是 你想要的字符总数 选择

即。以下示例将返回从关键字

之前的15个字符开始的30个数据字符
SUBSTRING(field_name, LOCATE('keyword', field_name) - 15, 30)

注意:正如aryeh指出的那样,SUBSTRING()中的任何负值都会大大增加 - 例如,如果在字段的第一个[chars_before]字符中找到关键字,那么最后的[chars_before]字符数据就会出现该领域被退回。

答案 3 :(得分:0)

我认为最好的办法是通过SQL查询获取结果,并以编程方式应用正则表达式,以便在搜索到的单词之前和之后检索一组单词。

我现在无法测试,但正则表达式应该是这样的:

.*(\w+)\s*WORD\s*(\w+).*

在其中为搜索到的字词替换WORD,并将正则表达式组1用作之前的单词,将2用作后续单词

稍后当我问RegexBuddy它是否可行时,我会测试它,我会在这里发布