1

LIKE を使用して基本的な検索機能を構築しています (フルテキストを使用しますが、現時点ではできません)。MySQL でキーワードを検索できるかどうか疑問に思っています (例: WHERE フィールド LIKE '%word%' ) キーワードの両側にある 20 語も返しますか?

4

4 に答える 4

2

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
    )
)

)

于 2010-03-24T16:28:03.290 に答える
0

返される単語の数を制限することはできないと思いますが、返される文字の数を制限するには、次のようなことができます

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] 文字は戻ってきた。

于 2008-09-01T17:26:03.443 に答える
0

あなたの最善の策は、SQLクエリを介して結果を取得し、プログラムで正規表現を適用して、検索された単語の前後の単語のグループを取得できるようにすることだと思います.

今はテストできませんが、正規表現は次のようになります。

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

検索された単語を置き換えWORD、正規表現グループ 1 を前の単語として、2 を後の単語として使用します。

後でRegexBuddyに動作するかどうかを尋ねてテストします:)そしてここに投稿します

于 2008-09-01T18:19:03.360 に答える
0

INSTR() 関数を使用して文字列内の単語の位置を見つけ、SUBSTRING() 関数を使用してその位置の前後の文字の一部を選択します。

SUBSTRING 命令で負の値を使用しないように注意する必要があります。そうしないと、奇妙な結果が得られます。

それを試して、また報告してください。

于 2008-09-01T15:45:20.627 に答える