2

私は自分のサイトのメッセージ部分の検索機能を構築しており、9,000,000 行を少し超えるメッセージ データベースがありsendersubject、 、messageフィールドにインデックスが付けられています。(例) のように、クエリで LIKE mysql 句を使用することを望んでいました

SELECT sender, subject, messageFROM MessagesWHERE messageLIKE '%EXAMPLE_QUERY%';

結果を取得します。残念ながら、先頭のワイルドカードが存在する場合、MySQL はインデックスを使用しません。これは、検索クエリがメッセージのどこにでも表示される可能性があるために必要です (これがワイルドカードの仕組みですよね?)。クエリは非常に遅く、煩わしい 50% ルールのため、フルテキスト インデックスも使用できません (それだけを除外する余裕はありません)。likeと2つのワイルドカードを使用してクエリを最適化する方法はありますか? どんな助けでも大歓迎です。

4

4 に答える 4

3

フルテキスト インデックスを使用するか (できないと言っていました)、自分でフルテキスト検索を設計するか、MySQL から検索をオフロードして Sphinx/Lucene を使用する必要があります。Lucene の場合、Zend Framework の Zend_Search_Lucene 実装を使用するか、Solr を使用できます。

MySQL の通常のインデックスは B+Tree であり、文字列の先頭が不明な場合は使用できません (これは先頭にワイルドカードがある場合に当てはまります)

別のオプションは、参照テーブルを使用して、独自に検索を実装することです。テキストを単語に分割し、単語 record_id を含むテーブルを作成します。次に、検索でクエリを単語に分割し、参照テーブル内の各単語を検索します。このようにして、テキスト全体の先頭に制限するのではなく、指定された単語の先頭にのみ制限します (とにかく、残りの単語を一致させます)。

于 2012-04-14T10:29:41.683 に答える
0

'%EXAMPLE_QUERY%';非常に悪い考えです..あなたにいくつかを与えるつもりです

'EXAMPLE_QUERY%';A.代わりにLIKEクエリの開始時にワイルドカードを使用しないでください

B.簡単に使用できるキーワードを作成するMATCH

于 2012-04-14T10:22:11.827 に答える
0

MySQL を使い続けたい場合は、FULL TEXT インデックスを使用する必要があります。フルテキスト インデックスは、テキスト ブロック内のインデックス ワードです。その後、語幹を検索して、関連性の高い順に結果を返すことができます。したがって、テキスト ブロック内で「example」という単語を見つけることはできますが、「xampl」で効率的に検索して「example」を見つけることはできません。

MySQL の全文検索は良くありませんが、機能的です。

http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

于 2012-04-14T11:41:24.717 に答える
-3
select * from emp where ename like '%e';

文字 e で終わる emp_name を指定します。

select * from emp where ename like 'A%';

文字 a で始まる emp_name を指定します。

select * from emp where ename like '_a%';

2 番目の文字が a である emp_name を指定します。

于 2012-04-14T10:24:33.780 に答える