【问题标题】:Selecting X words from a text field in MySQL从 MySQL 中的文本字段中选择 X 个单词
【发布时间】:2010-09-07 11:19:46
【问题描述】:

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

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

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

    试试看,然后报告。

    【讨论】:

      【解决方案2】:

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

      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] 字符中字段被返回。

      【讨论】:

        【解决方案3】:

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

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

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

        您将WORD 替换为搜索词并使用正则表达式组 1 作为前词,使用 2 作为后词

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

        【讨论】:

          【解决方案4】:

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

          )

          【讨论】:

          • 如果我有多个单词要匹配?我该怎么办?
          猜你喜欢
          • 1970-01-01
          • 2019-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多