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  |

同じレコードからの結果が2つあることに注意してください。それも可能ですか?

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 に答える