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

从MySQL中的文本字段中选择X个单词,mysql,Mysql,我正在构建一个基本的搜索功能,使用LIKE(我会使用全文,但目前不能),我想知道MySQL在搜索关键字(例如,WHERE字段,如“%word%”)时,是否可以在关键字两侧返回20个单词,以及?使用INSTR()函数查找单词在字符串中的位置,然后使用SUBSTRING()函数选择位置前后的部分字符 您必须注意子字符串指令不使用负值,否则会得到奇怪的结果 试试看,然后再报告。我认为不可能限制返回的字数,但是要限制返回的字符数,可以执行以下操作 SELECT SUBSTRING(field_name,

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

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

您必须注意子字符串指令不使用负值,否则会得到奇怪的结果


试试看,然后再报告。

我认为不可能限制返回的字数,但是要限制返回的字符数,可以执行以下操作

SELECT SUBSTRING(field_name, LOCATE('keyword', field_name) - chars_before, total_chars) FROM table_name WHERE field_name LIKE "%keyword%"
  • chars_before-是 要在选择之前选择的字符 关键词
  • 总字符数-是 您希望添加的字符总数 挑选
i、 e.以下示例将返回30个字符的数据,从关键字前的15个字符开始

SUBSTRING(field_name, LOCATE('keyword', field_name) - 15, 30)

注意:正如aryeh指出的,SUBSTRING()中的任何负值都会让事情变得相当糟糕——例如,如果关键字位于字段的第一个[chars_before]字符中,那么最后一个[chars_before]字符中返回字段中的数据字符。

我认为您最好的选择是通过SQL查询获得结果,并通过编程应用正则表达式,这将允许您检索搜索单词前后的一组单词

我现在无法测试它,但正则表达式应该类似于:

.*(\w+)\s*WORD\s*(\w+).*
其中,您为搜索的单词替换
WORD
,并使用正则表达式组1作为单词前,使用正则表达式组2作为单词后


稍后我将测试它,当我可以询问它是否有效时:),我将在这里发布它

您可以使用子字符串索引在查询中完成所有操作

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
    )
)

)

如果我有多个单词要匹配?我该怎么办?