1

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

4

4 回答 4

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

)

于 2010-03-24T16:28:03.290 回答
0

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

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

试试看,然后报告。

于 2008-09-01T15:45:20.627 回答
0

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

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] 字符是回来。

于 2008-09-01T17:26:03.443 回答
0

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

我现在不能测试它,但正则表达式应该是这样的:

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

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

我稍后会测试它,当我可以询问我的RegexBuddy是否可以工作时:) 我会在这里发布

于 2008-09-01T18:19:03.360 回答