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

时间:2020-03-05 18:46:01  来源:igfitidea点击:

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

解决方案

回答

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

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

尝试一下,然后报告。

回答

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

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

即以下示例将从关键字前的15个字符开始返回30个字符的数据

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

注意:正如aryeh所指出的,SUBSTRING()中的任何负值都会使事情大打折扣,例如,如果在字段的前[chars_before]个字符中找到了关键字,则返回该字段中最后一个[chars_before]个字符。

回答

我认为最好的选择是通过SQL查询获得结果,并以编程方式应用正则表达式,从而使我们可以在搜索到的单词之前和之后检索一组单词。

我现在无法对其进行测试,但是正则表达式应该类似于:

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

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

当我可以问我的RegexBuddy是否可以工作时,我将对其进行测试:),并将其发布在此处

回答

我们可以使用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
    )
)

)