1

次のクエリがあります。

SELECT * `library` WHERE 
    ( 
    UCASE(  `text` ) REGEXP  '((^KEYWORD|[[.space.]]KEYWORD)([[.space.]]|[[.comma.]]|[[.period.]]|[[.colon.]]|[[.semicolon.]]|[[.apostrophe.]]|[[.quotation-mark.]]|[[.exclamation-mark.]]|[[.question-mark.]]))((^KEYWORD2|[[.space.]]KEYWORD2)([[.space.]]|[[.comma.]]|[[.period.]]|[[.colon.]]|[[.semicolon.]]|[[.apostrophe.]]|[[.quotation-mark.]]|[[.exclamation-mark.]]|[[.question-mark.]]))'
    )

** 編集 **

SQLフィドルを追加しました:

http://sqlfiddle.com/#!2/8f822/2/0

読み取り可能な形式では、これは次のとおりです。

SELECT * FROM `library` WHERE 
    ( 
    UCASE(  `text` ) REGEXP  '
            (
                (
                ^KEYWORD | [[.space.]]KEYWORD
                )
                (
                [[.space.]] |
                [[.comma.]] | 
                [[.period.]] | 
                [[.colon.]] |
                [[.semicolon.]] |
                [[.apostrophe.]] | 
                [[.quotation-mark.]] | 
                [[.exclamation-mark.]] | 
                [[.question-mark.]]
                )
            ) 

            (
                (
                ^KEYWORD2 | [[.space.]]KEYWORD2
                )
                (
                [[.space.]] |
                [[.comma.]] | 
                [[.period.]] | 
                [[.colon.]] |
                [[.semicolon.]] |
                [[.apostrophe.]] | 
                [[.quotation-mark.]] | 
                [[.exclamation-mark.]] | 
                [[.question-mark.]]
                )
            ) 
        )'

ここで、次のことを行うためのクエリが必要ですが、ここでレンガの壁にぶつかっています。

キーワードがテキスト内に表示される場合、テキストを開始するか、前にスペースを置き、その後に特殊文字の 1 つを続けて、結果を表示します。

これは私が必要としているように実際には機能しませんが、両方が表示された場合に一致させる方法をドキュメントで見つけることができません。たとえば、文字列を一致させようとする"keyword,""keyword "または"keyword;"

次に、キーワード 2 に対して同じタイプのクエリを一致させる必要があります。

次に、keyword と keyword2 の両方の式が true である必要があり、それらの結果のみが必要です。

たとえば、テキスト

A lazy brown fox jumped over the fence. 
Then he found a chicken. 
Then he ate the chicken and ran from the farmer.

A fox found a chicken. 
Then he ate the chicken and ran from the farmer.
Then fox jumped over the fence. 

彼は次のキーワードで操作する必要がありますfence chicken

しかし、これは次のテキストと一致するべきではありません

A lazy brown fox jumped over the fences. 
Then he found a chicken. 
Then he ate the chicken and ran from the farmer.

答え

最終的なクエリは次のようになりました

SELECT *
FROM`library`
WHERE
UCASE(`text` ) REGEXP '(^| )FENCE[[.space.][.comma.][.period.][.colon.][.semicolon.][.apostrophe.][.quotation-mark.][.exclamation-mark.][.question-mark.]]'
AND
UCASE(`text` ) REGEXP '(^| )CHICKEN[[.space.][.comma.][.period.][.colon.][.semicolon.][.apostrophe.][.quotation-mark.][.exclamation-mark.][.question-mark.]]'

正規表現はランダムな順序の検索をサポートしておらず、 nをキーワード検索文字列の数の累乗にしたくないので、これが最善の解決策です。

見てくれてありがとう。

4

1 に答える 1

1

正規表現を使用して、(^| )KEYWORD[- ,.:;'"!?]2 つの REGEXP テストを WHERE 句に AND で結合することができます。最初の部分(^| )は、テキストまたはスペースの開始を照合できるようにする正規表現です。次に、そのまま一致する必要があるキーワードと、クラス[]の単一の文字が一致する必要がある文字クラスが続きます。|これは、完全な正規表現ではなく、単一文字の OR のようなものです。

SELECT *
FROM`library`
WHERE
UCASE(`text` ) REGEXP '(^| )KEYWORD[- ,.:;''"!?]'
AND
UCASE(`text` ) REGEXP '(^| )KEYWORD2[- ,.:;''"!?]'

免責事項 : SQL ステートメントをテストしていないため、文字列内でアポストロフィを二重にする必要があるかどうかを思い出せません。

于 2012-09-19T13:41:57.243 に答える