MySQL ベースの検索エンジンの実装序文: 実際、MySQL は長い間フルテキスト インデックスをサポートしてきましたが、サポートされていたのは英語の検索のみでした。バージョン 5.7.6 以降、MySQL には中国語、日本語、韓国語の単語分割をサポートする ngram フルテキスト パーサーが組み込まれています。 Mysql フルテキスト インデックスは、転置インデックスの原理を採用しています。転置インデックスでは、キーワードが主キーとなり、各キーワードはキーワードが出現する一連のファイルに対応します。このように、ユーザーがキーワードを検索すると、ソート プログラムは逆インデックス内でキーワードを見つけ、そのキーワードを含むすべてのファイルをすぐに見つけることができます。
1. ngram全文パーサーngram は、テキスト内の n 個の連続した単語のシーケンスです。 ngram フルテキスト パーサーは、各単語が n 個の連続した単語のシーケンスであるテキストをトークン化できます。たとえば、ngram フルテキスト パーサーを使用して「你好靓仔」をセグメント化します。 n=1: 「あなた」、「いい人」、「かわいい」、「男の子」 n=2: 「こんにちは」、「とてもかわいい」、「ハンサムな男の子」 n=3: 「あなたはとてもきれいですね」、「あなたはとてもきれいですね」 n=4: 「こんにちは、ハンサムな男の子」 MySQL では、グローバル変数 次のコマンドを実行すると、MySQL のデフォルトの 'ngram_token_size' のような変数を表示する グローバル変数 (1)mysqldコマンドを起動するときに、以下を指定します。 mysqld --ngram_token_size=2 (2)MySQL設定ファイルmy.iniを変更し、最後にパラメータの行を追加します。 nグラムトークンサイズ=2 2. 全文インデックスを作成する1. テーブルを構築するときにフルテキストインデックスを作成するテーブル「記事」を作成します( `id` bigint NOT NULL、 `url` varchar(1024) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', `title` varchar(256) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', `source` varchar(32) COLLATE utf8mb4_general_ci DEFAULT '' `keywords` varchar(32) COLLATE utf8mb4_general_ci デフォルト NULL, `publish_time` タイムスタンプ NULL デフォルト NULL、 主キー (`id`)、 フルテキストキー `title_index` (`title`) とパーサー `ngram` ) エンジン=InnoDB デフォルト文字セット=utf8mb4 照合=utf8mb4_general_ci; 2. テーブル変更方法ALTER TABLE article に FULLTEXT INDEX title_index(title) を追加し、PARSER ngram を追加します。 3. インデックス作成メソッドを通じてPARSER ngram を使用して article (title) に FULLTEXT インデックス title_index を作成します。 3. 検索方法1. 自然言語検索(自然言語モード)自然言語モードは、MySQL のデフォルトの全文検索モードです。自然言語モードでは演算子を使用できず、キーワードが表示される必要がある、または表示されない必要があるなどの複雑なクエリを指定することはできません。 例: select * from article where MATCH(title) AGAINST ('北京観光' IN NATURAL LANGUAGE MODE); // モードが指定されていない場合は、デフォルトで自然言語モードが使用されます select * from article where MATCH(title) AGAINST ('北京旅游'); このモードでは、「北京 旅行」を検索すると、自然言語に基づいて 2 つのキーワードに分割されるため、「北京」または「旅行」を含むコンテンツを検索できることがわかります。 上記の例では、返される結果は一致度によって自動的にソートされ、最も一致度が高いものが先頭に表示されます。一致度は、負でない浮動小数点数です。 例: // 一致度を確認します。select *、MATCH(title) AGAINST ('Beijing Tourism') as score from article where MATCH(title) AGAINST ('Beijing Tourism' IN NATURAL LANGUAGE MODE); 2. ブール検索(ブールモード)ブール検索モードでは、演算子を使用して、キーワードが表示される必要があるか表示されない必要があるか、キーワードの重みが高いか低いかを指定するなどの複雑なクエリをサポートできます。 例: // 演算子なし // 「デート」または「戦略」を含む select * from article where MATCH(title) AGAINST ('Dating Guide' IN BOOLEAN MODE); // 演算子を使用する // 「デート」を含める必要がありますが、「戦略」を含めることができます select * from article where MATCH(title) AGAINST ('+Dating Guide' IN BOOLEAN MODE); その他の演算子の例: 「デートのヒント」 演算子なし、OR を意味し、「デート」または「戦略」のいずれかを含む 「+デート+戦略」 「+デートのヒント」という単語の両方を含める必要があります 「デート」が含まれている必要がありますが、「戦略」も含まれている場合は一致率が高くなります。 「+デート戦略」 「日付」を含める必要があり、「戦略」を含めることはできません。 「+デート〜戦略」 「デート」は必ず含める必要がありますが、「戦略」も含めると、一致スコアは「戦略」なしの記録よりも低くなります。 '+デート+(>戦略<ヒント)' クエリには、「デート」と「戦略」または「デート」と「スキル」のレコードが含まれている必要がありますが、「デート戦略」は「デートスキル」よりも一致率が高くなります。 「デート*」 クエリには、「Appointment」で始まるレコードが含まれます。 「デートのヒント」 検索する単語を二重引用符で囲みます。効果は「%Dating Guide%」のようになります。 たとえば、「初心者向けのデート戦略」は一致しますが、「デート戦略」は一致しません。 4. 類似品との比較同様のクエリと比較して、フルテキスト インデックスには次の利点があります。
全文検索のパフォーマンスは類似クエリよりも優れています 以下は約50wのデータに基づいたテストです。 // クエリのように select * from article where title like '%北京%'; // フルテキスト インデックス クエリ select * from article where MATCH(title) AGAINST ('北京' IN BOOLEAN MODE); 類似クエリは 1.536 秒、全文インデックス クエリは 0.094 秒と、約 16 倍高速であることがわかります。 全文インデックスを使用すると高速な検索が可能になりますが、インデックスを維持するためのオーバーヘッドも発生します。フィールドの長さが長くなるほど、作成されるフルテキスト インデックスが大きくなり、DML ステートメントのスループットに影響します。データ量が多くない場合は、フルテキストインデックスを使用して検索できます。これは簡単で便利です。ただし、データ量が多い場合は、専用の検索エンジン ElasticSearch を使用して検索することをお勧めします。 以上がMySQLをベースにした簡単な検索エンジンの実装の詳細です。MySQLを使った検索エンジンの実装の詳細については、123WORDPRESS.COMの他の関連記事をご覧ください。今後とも123WORDPRESS.COMをよろしくお願いいたします! 以下もご興味があるかもしれません:
|
<<: 純粋な CSS でカスタムラジオボタンとチェックボックス機能を実装する
>>: CSS でより美しいリンクプロンプト効果をカスタマイズする方法
CS: ...コードをコピーコードは次のとおりです。 html,body{ margin:0px; ...
W3C の原則によれば、XML の各開始タグには対応する終了タグが必要です。つまり、<html...
目次環境設定の概要1.K8Sとは何ですか? 2. K8S を使用する理由3. K8S を使用する利点...
この記事の例では、ストップウォッチタイマーを実装するためのJSの具体的なコードを参考までに共有してい...
序文Linux システムのパフォーマンスを監視するために使用できるオープンソースの監視ツールが市場に...
この記事では、WeChatアプレットの計算機機能を実装するための具体的なコードを参考までに紹介します...
目次1. proxy と Object.defineProperty の利点2. プロキシ監視オブジ...
実践こそが真実をテストする唯一の方法です。この記事では、インデックスの全体的な使用法についてのみ説明...
目次1. React フックと純粋関数2. シンプルなmyUseState 3. myUseStat...
Linux システムで .sh ファイルを実行する方法は 2 つあります。たとえば、ルート ディレク...
IPマスカレードとポート転送Firewalldは2種類のネットワークアドレス変換をサポートしています...
目次最初のステップはMySQLをダウンロードすることですステップ2: ダウンロードした圧縮パッケージ...
目次1. イベント委任とは何ですか? 2. イベント委任の原則3. イベント委託の役割1. イベント...
Docker は 2013 年のリリース以来、広く注目され、ソフトウェア業界を変える可能性を秘めてい...
ナビゲーション バー、固定トップ ナビゲーション バー、およびセカンダリ メニューの実装効果図の実装...