5

我有一个包含书籍章节的 MySQL 表。

Table: book_chapter
--------------------------
| id | book_id | content |
--------------------------

我目前可以像这样使用全文搜索来搜索内容:

SELECT * FROM book_chapter WHERE book_chapter.book_id="2" AND
MATCH (book_chapter.content) AGAINST ("unicorn hair" IN BOOLEAN MODE)

但是,我想知道是否可以搜索内容并以 30 个字符片段的形式返回结果,以便用户能够感受到要点。例如,如果我搜索“独角兽头发”,我会得到这样的结果:

-------------------------------------------------
| id | book_id | content                        |
-------------------------------------------------
| 15 |    2    | it isn't unicorn hair. You kno |
 -------------------------------------------------
| 15 |    2    | chup and unicorn hair in soup  |
 -------------------------------------------------
| 27 |    2    | , should unicorn hair be used  |
 -------------------------------------------------
| 31 |    2    | eware of unicorn hair for bal  |

请注意,同一记录有两个结果。这也可能吗?

4

2 回答 2

3

Mike Bryant 对查询的改进

如果匹配在字段的开头,则 SUBSTRING 将从结尾开始。

我刚刚添加了一个 IF 语句来修复它

SELECT 
    id, 
    book_id, 
    SUBSTRING(
        content, 
        IF(LOCATE("unicorn hair", content) > 10, LOCATE("unicorn hair", content) - 10, 1),
        10 + LENGTH("unicorn hair") + 10
    ) 
FROM 
    book_chapter 
WHERE book_chapter.book_id="2" 
AND MATCH (book_chapter.content) AGAINST ("unicorn hair" IN BOOLEAN MODE)
于 2014-07-14T14:49:28.310 回答
1

尝试这样的方法来创建搜索短语的第一个匹配的片段加上它之前的 10 个字符和之后的 10 个字符(这不是 30 个字符的长度,但可能是更好的解决方案,具体取决于搜索短语的长度,即,如果您的搜索短语 > 30 个字符怎么办)。这不能满足您希望在结果集中显示同一记录的多个结果。对于类似的事情,我几乎认为您将是创建存储过程来为您完成工作的最佳服务器。

SELECT id, book_id, SUBSTRING(content, LOCATE("unicorn hair", content) - 10, 10 + LENGTH("unicorn hair") + 10) FROM book_chapter WHERE book_chapter.book_id="2" AND
MATCH (book_chapter.content) AGAINST ("unicorn hair" IN BOOLEAN MODE)

显然,您可以将“独角兽头发”替换为您在所有位置的搜索词组。

于 2012-09-04T18:48:43.880 回答