3

私は数日間、これに対する解決策を見つけようとして頭を悩ませてきました. 幅広い検索用語を処理できる「スマートな」クエリを作成しようとしています。特殊文字が含まれるまでクエリは正常に実行され、コンマやダッシュなどの一部の文字で REPLACE メソッドを使用して成功しました。引用符やアンパサンドなどのその他の文字は、空のクエリになります。

いくつかの例を次に示します。

私が検索している元の名前は "French Is Fun, Book 1 - 1 Year Option" で、以下のクエリを使用すると、次の検索用語で結果が返されます。

1.  "French Is Fun"
2.  "French Is Fun, book"
3.  "French Is Fun, book"
4.  "French Is Fun, Book 1"


SELECT * FROM `products` WHERE ( (LOWER(name) LIKE '%french is fun book%' OR
LOWER(replace(name, '  ','')) LIKE '%french is fun book%' OR
LOWER(replace(name, ' ','')) LIKE '%french is fun book%' OR
LOWER(replace(name, '-','')) LIKE '%french is fun book%')

ただし、元のタイトルに「Global History & Geography: The Growth of Civilizations - 1 Year Option」のようにアンパサンドが含まれている場合、これらの異なる検索用語を試してみると、空のクエリが表示されます。

1.  "Global History & Geography"
2.  "Global History Geography"

私は無駄にこれを試しました

SELECT * FROM `products` WHERE  
(LOWER(name) LIKE '%global history geograph%' OR  
    LOWER(replace(name, '  ','')) LIKE '%global history geography%' OR  
    LOWER(replace(name, ' ','')) LIKE '%global history geography%' OR 
    LOWER(replace(name, ',','')) LIKE '%global history geography%' OR 
    LOWER(replace(name, '&','')) LIKE '%global history geography%' OR  
    LOWER(replace(name, '-','')) LIKE '%global history geography%');

また、アンパサンドにエスケープ文字を追加しようとしましたが、役に立ちません:

SELECT * FROM `products` WHERE  
(LOWER(name) LIKE '%global history geography%' OR  
    LOWER(replace(name, '  ','')) LIKE '%global history geography%' OR  
    LOWER(replace(name, ' ','')) LIKE '%global history geography%' OR 
    LOWER(replace(name, ',','')) LIKE '%global history geography%' OR 
    LOWER(replace(name, '\&','')) LIKE '%global history geography%' OR  
    LOWER(replace(name, '-','')) LIKE '%global history geography%');

また、名前のコンマも空の結果を返します。デモンストレーションとして、元の名前は次のとおりです。

「Amsco の AP Calculus AB/BC Advanced Placement Examinations の準備 - 1 年オプション」

この試行は常に空のクエリを返します。

SELECT * FROM `products` WHERE 
( (LOWER(name) LIKE '%amscos ap calculus%' OR
     LOWER(replace(name, ' ','')) LIKE '%amscos ap calculus%' OR
     LOWER(replace(name, '\'','')) LIKE '%amscos ap calculus%' OR
     LOWER(replace(name, ',','')) LIKE '%amscos ap calculus%' OR
     LOWER(replace(name, '-','')) LIKE '%amscos ap calculus%')
    ) AND ( (`products`.`type` = 'Rental' ) );

何か案は?

4

2 に答える 2

3

あなたが行っている方法では、リソースが枯渇するまで、DB サーバーに同じ作業を何度も実行させることになります。

短縮版:

既に特殊文字が取り除かれ、小文字になっているタイトルを含む別の列をテーブルに追加します。それを踏まえて選ぶ。

ミディアムバージョン:

全文索引作成/検索を使用します。

ロングバージョン

個々の単語とさまざまなタイトルへの関連付けを追跡する別のテーブル構造を作成し、それを検索するためのクエリ/プログラム ロジックを作成します。

于 2012-10-25T16:26:15.560 に答える