2012-09-04 61 views
4

我有一个包含书籍章节的MySQL表。全文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 | 

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

回答

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) 

显然你会用任何你的搜索短语在所有的位置替换“独角兽头发”。

2

麦克科比

如果比赛是在外地的开始查询的改进,那么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) 
+1

也可以使用GREATEST防止欠载。 –

+0

这只适用于确切的短语。那么两个词分开的时候呢? MATCH .. AGAINST也会返回这些。 – jor