LIKE を使用して基本的な検索機能を構築しています (フルテキストを使用しますが、現時点ではできません)。MySQL でキーワードを検索できるかどうか疑問に思っています (例: WHERE フィールド LIKE '%word%' ) キーワードの両側にある 20 語も返しますか?
4 に答える
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
)
)
)
返される単語の数を制限することはできないと思いますが、返される文字の数を制限するには、次のようなことができます
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] 文字は戻ってきた。
あなたの最善の策は、SQLクエリを介して結果を取得し、プログラムで正規表現を適用して、検索された単語の前後の単語のグループを取得できるようにすることだと思います.
今はテストできませんが、正規表現は次のようになります。
.*(\w+)\s*WORD\s*(\w+).*
検索された単語を置き換えWORD
、正規表現グループ 1 を前の単語として、2 を後の単語として使用します。
後でRegexBuddyに動作するかどうかを尋ねてテストします:)そしてここに投稿します
INSTR() 関数を使用して文字列内の単語の位置を見つけ、SUBSTRING() 関数を使用してその位置の前後の文字の一部を選択します。
SUBSTRING 命令で負の値を使用しないように注意する必要があります。そうしないと、奇妙な結果が得られます。
それを試して、また報告してください。