私は db コンサルタントを雇いました。彼は、私の現在の完全な mysql システムの全文検索側を処理するために solr の使用を推奨しており、しばしば遅い検索を高速化します (検索あたり最大 30 秒)。
彼/私たちの大部分は、a) mysql 設定を微調整して余分なパフォーマンスを絞り出すこと、および b) solr をインストールすることに費やされました。しかし、今は終わりに近づいており、最初のいくつかの solr テスト クエリは失敗しているようです。
まず、現在の完全な Mysql セットアップの関連する 3 つのテーブルと、MySQL/Solr アプローチに置き換えようとしている完全な MySQL クエリを次に示します。次に、テストしている Solr クエリです。
TABLE1 - 全文検索レコードが格納されるメイン テーブル。songID 列、Artist 列、および Title 列で構成されます。INDEXES - songID primary、Artist Fulltext (非一意)、Artist btree (非一意)、Title Fulltext (非一意)、Title btree (非一意)
TABLE2 - DJ ソング リストの保存用。上記のテーブルの ID を参照します。一部の DJ には 150,000 以上の曲があるため、TABLE1 の曲を参照する 150,000 以上の行がここにあります。また、TABLE2 には ID 列と曲バージョン列 (バージョン名) があるため、DJ は同じ曲の複数のバージョンに独自のバージョン参照を適用できます (つまり、同じ曲の複数の行で、それぞれが異なるバージョン データを持ちます)。INDEXES - ID プライマリ、djID btree (一意でない)、songID btree (一意でない)。
TABLE3 - TABLE2 の ID への参照とタグの ID (TAGS と呼ばれる別のテーブル) を含むタグ マップ テーブル。ジャンル、言語、年代の各曲のタグを TABLE2 に格納します。また、DJ は複数の曲リスト (List1、List2 などのタグ付き) を持つことができるため、各曲が属する曲リストへの参照が含まれます。各曲には、DJ ごとに最大約 12 個のタグを付けることができます。INDEXES - 行 ID プライマリ、ID btree (一意でない)、tag_id (一意でない)
アーティスト キーワード「beatles」の現在の mysql 検索クエリは次のとおりです。関連する唯一のタグは、DJ 33 の List1 の曲に一致するもののみを選択するように指示するものです。
"SELECT t1.*, t2.version
FROM table1 t1, table2 t2, tagmap tm, tag t
WHERE MATCH (t1.Artist) AGAINST ('+beatles* ' IN BOOLEAN MODE)
AND tm.tag_id = t.tag_id
AND (t.name IN ('List1'))
AND t2.ID = tm.ID
AND t2.songID = t1.songID
AND t2.djID = '33'
GROUP BY t2.ID
HAVING COUNT( tm.tag_id )=1
ORDER BY t1.Artist, t1.Title ASC LIMIT {$lastRowNum},{$limit1}";// pagination blah
動作しますが、リストが 5000 を超えると遅くなります。
彼が提案した SOLR ソリューション:
- TABLE1 の曲の solr インデックスを作成する
- 検索中に、問題の DJ に属する songID について mysql の TABLE2 をクエリします。
Artist のキーワードの solr クエリを作成し、DJ の songID を挿入します...
.../solr/select/?q=id:(3688804 3688807) AND アーティスト:beatles&wt=json
(ここでは見やすいように、URL とスペースと角かっこを省略しましたが、作業コードでは %20 などに置き換えられています)
上記の 2 つの曲 ID だけの例は機能しているように見えましたが、テストでは、クエリに約 1000 を超える曲 ID を追加し始めるとすぐにクエリが失敗します。一部の DJ には 150,000 以上の曲があるため、150,000 以上の一意の songID を solr クエリに挿入する可能性があることを考えると、これは欠陥のあるソリューションのようです。
また、タグがどのようにクエリプロセスに入るのかわかりません。
ご覧いただきありがとうございます。