2017-02-05 18 views
0

現在、私のdbにキーワード/タグの検索を実装しようとしています。私のDBにLaravel Eloquent/SQL - dbでキーワードを検索

は、私のようなキーワードでラインを持っている: auto,cabrio,frischluftまたはhose,jeans,blaue hose,kleidung

ので、常にいくつかのキーワード(それは基本的にも空白を持つことができる)、コンマ(,)で区切られました。

今、いくつかのキーワードが入力されているdb内の製品を検索できます。

LIKEで、私は私がauto,cabrioたりもcabrio,frischluftまたはhose,jeans,blauまたはhose,kleidungようなクエリで述べた2つのエントリを見つけることができます。しかし、auto,frischluftなど、hose,blaue hosejeans,kleidungなどと入力するとどうなりますか?

次にLIKEはもう動作しません。これを行う方法はありますか?

私はちょうどそれを明確にするために

...あなたは私が何を意味するか知っている願っています:私は現在使用してコードは次のとおりです。 $searchQuery = "%".$request->input('productSearch')."%"; $products = Product::where('name', 'LIKE', $searchQuery)->paginate(15);

しかし、私は、これはしません、言ったように入力productSearchキーワードauto,frischluftが入力されている場合の任意のアイデア...

をkeyowrds auto,cabrio,frischluftとの記事を私を取り戻しますか?ちょうど今、お返事に

答えて

0

https://dev.mysql.com/doc/refman/5.7/en/regexp.html:あなたは、それは単純に、このMySQLのドキュメントを読みたい場合は

基本的に、ファイル内にgrep[,]?blaue hose[,]?を見つけることができます:オプションのコンマ、文字列 'blaue hose'、およびオプションのカンマ。

より多くの固溶体が私の最初の答えは次のようになります。

あなたは、実際には各キーフレーズ/キーワード 自体が1列にあり、さらにインデックスを築くところ、あなたのproductsテーブルに応じて、キーワードテーブルを作成することができますキーフレーズ/キーワードに私はにVerticaでそれを行う方法ですここに - 入力としてあなたの例を取るために、

Optimising LIKE expressions that start with wildcards

そして:私はここで原理を説明します。多くのデータベースは、 を、選択した文字で区切られた文字列のn番目の部分/トークンを返す関数を提供しています。 Verticaでは、SPLIT_PART()です。

MySQLは、あいにくその関数との対応を提供していないため、以下のWITH節のCommon Table ExpressionsをインラインSELECT-S(SELECT ... FROM (SELECT ...) AS foo(col1,col2,col3) ....)に変換する必要があります。そして、提案はそれに対処する方法についてはダニエルVassallo氏からはここにあります:にVerticaで

Split value from one field to two

、それは次のようになります。

WITH 
-- input 
products(prod_id,keywords) AS (
      SELECT 1001,'auto,cabrio,frischluft' 
UNION ALL SELECT 1002,'hose,jeans,blaue hose,kleidung' 
) 
, 
-- index to get the n-th part of the comma delimited string 
max_keyword_count(idx) AS (
      SELECT 1 
UNION ALL SELECT 2 
UNION ALL SELECT 3 
UNION ALL SELECT 4 
UNION ALL SELECT 5 
) 
SELECT 
    prod_id 
, idx 
, TRIM(SPLIT_PART(keywords,',',idx)) AS keywords 
FROM products 
CROSS JOIN max_keyword_count 
WHERE SPLIT_PART(keywords,',',idx) <> '' 
ORDER BY 
    prod_id 
, idx 
; 

prod_id|idx|keywords 
    1,001| 1|auto 
    1,001| 2|cabrio 
    1,001| 3|frischluft 
    1,002| 1|hose 
    1,002| 2|jeans 
    1,002| 3|blaue hose 
    1,002| 4|kleidung 
+0

答えのためのThxをしかし、これは非常に困難に聞こえます..これを行う簡単な方法はありますか? – nameless

+0

その場合、このMySQLのドキュメントをお読みください:https://dev.mysql.com/doc/refman/5.7/en/regexp.html。基本的には、ファイル内で '[、]?blaue hose [、]?'を探してgrepすることができます:オプションのカンマ、文字列 'blaue hose'、およびオプションのカンマ。 – marcothesane

+0

しかし、これは基本的には「好き」がやることでしょうか? 「ホース、ブラスホース」を使用する際に、私はあなたの考えをどのように使うことができるのでしょうか?商品に「ホース、ジーンズ、ブラスホース、クライドン」と書かれています – nameless