2012-09-04 86 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