MySQL全文検索の使用例

MySQL全文検索の使用例

1. 環境整備

MySQL 5.7.6 より前のバージョンでは、フルテキスト インデックスは英語のフルテキスト インデックスのみをサポートしており、中国語のフルテキスト インデックスはサポートしていませんでした。単語セグメンターを使用して中国語の段落を単語に前処理し、データベースに保存する必要がありました。 MySQL 5.7.6 以降、MySQL には中国語、日本語、韓国語の単語分割をサポートする ngram フルテキスト パーサーが組み込まれています。 この記事で使用されている MySQL バージョンは 5.7.22、InnoDB データベース エンジンです。

したがって、ここではMySQLバージョン5.7.6以上が必要です。

-- MySQL のバージョンを確認します。mysql> select version();
+-----------+
| バージョン() |
+-----------+
| 5.7.33 |
+-----------+
セット内の1行(0.02秒)

単語の分割と最小単語長をmysql設定ファイルに追加します(すでに設定されている場合、無視できます)

ft_min_word_len デフォルトの最小文字数は 4 です。これは英語では適切ですが、中国語では変更する必要があります。

ngram_token_size 分割の最小の長さ。例えば、hello worldの分割の長さは異なります。

n=1: 「あなた」、「良い」、「世界」、「世界」 
n=2: 「こんにちは」、「良い世界」、「世界」 
n=3: 「こんにちは世界」、「良い世界」 
n=4: 「こんにちは世界」
# /etc/mysql/mysql.conf.d/mysqld.cnf

ft_min_word_len = 2
nグラムトークンサイズ = 2


# そうでない場合は設定を追加 echo 'ft_min_word_len = 2
ngram_token_size = 2' >> mysqld.cnf

# サービスを再起動します /etc/init.d/mysql restart

-- mysql の設定を表示します> 
'ft_min_word_len' のような変数を表示します。
'ngram_token_size' のような変数を表示します。
+-----------------+-------+
| 変数名 | 値 |
+-----------------+-------+
| フィート最小単語長 | 2 |
+-----------------+-------+
セット内の1行(0.02秒)
 
+------------------+-------+
| 変数名 | 値 |
+------------------+-------+
| ngram_token_size | 2 |
+------------------+-------+
セット内の1行(0.03秒)


2. データの準備

-- 全文検索用 MySQL のデモ

mysql> テーブル `articles` を作成します (
  `id` int(10) 符号なし NOT NULL AUTO_INCREMENT,
  `title` varchar(50) デフォルト NULL コメント '件名',
  `content` ロングテキスト NOT NULL COMMENT 'content',
  主キー (`id`)、
  FULLTEXT KEY `title_content_index` (`content`,`title`) /*!50100 パーサー `ngram` */ 
) ENGINE=InnoDB AUTO_INCREMENT=7 デフォルト CHARSET=utf8;
クエリは正常、影響を受けた行は 0 行 (0.20 秒)
 

mysql> 記事にINSERT INTO (`title`, `content`) VALUES
        (「もしも」「もしあなたが望むなら、涙に濡れた夜を除いて、私はこの人生で二度とあなたのことを思い出すことはありません」)
        (「愛」、「ある日、道路標識が動いたとしても、あなたが落ち着いていられるといいな。ある日、橋脚が壊れたとしても、あなたが渡れるといいな。ある日、柱が倒れても、あなたが強くいられるといいな。ある日、期待が薄れても、あなたが理解できるといいな」)
        (「遠くて近い」、「あなたはしばらく私を見て、それから雲を見ます。あなたが私を見ると、私はとても遠くにいるように感じます。そして、あなたが雲を見ると、あなたはとても近くにいるように感じます。」)
        (「断片」、橋の上に立って景色を眺めると、
景色を眺めている人たちが、上の階からあなたを見ています。
明るい月があなたの窓を飾ります。
あなたは他人の夢を飾るのです。 ')、
        (「ソロ」、「石像のようにあなたが恋しいとあなたに言う、沈黙は正しくない。沈黙があなたの悲しみなら、この悲しみが私を最も傷つけることをあなたは知っている」)

クエリは正常、5 行が影響を受けました (0.08 秒)
記録: 5 重複: 0 警告: 0
 
mysql> SELECT * from articles where match(content, title) against('风景' in NATURAL LANGUAGE MODE) LIMIT 10;
+----+--------+----------------------------------------------------------------------------------------------------------------------------------------+
| ID | タイトル | コンテンツ |
+----+--------+----------------------------------------------------------------------------------------------------------------------------------------+
| 10 | 断片 | あなたは橋の上に立って景色を眺めます。
景色を眺めている人たちが、上の階からあなたを見ています。
明るい月があなたの窓を飾ります。
あなたは他人の夢を飾るのです。 |
+----+--------+----------------------------------------------------------------------------------------------------------------------------------------+
セット内の1行(0.02秒)

3. ショーを始める

  • 自然言語モード

自然言語モードは、MySQL のデフォルトの全文検索モードです。自然言語モードでは演算子を使用できず、キーワードが表示される必要がある、または表示されない必要があるなどの複雑なクエリを指定することはできません。

  • ブールモード

BOOLEAN モードでは、演算子を使用して、キーワードが表示される必要があるか表示されない必要があるか、キーワードの重みが高いか低いかを指定するなどの複雑なクエリをサポートできます。

  • クエリ拡張

クエリ結果は結果と一致するだけでなく、必要な他の結果も関連付けます。 (関連クエリに似ていますが、公式サイトではフレーズクエリのみをサポートすることを推奨しています。そうしないと、大量のダーティデータが表示されます)

-- 自然言語モード (NATURAL LANGUAGE MODE) クエリを実行してスコアを取得します。mysql> SELECT id, title, MATCH ( content, title ) against ( '风景' IN NATURAL LANGUAGE MODE ) AS score FROM articles;
+----+-----------+--------------------+
| ID | タイトル | スコア |
+----+-----------+--------------------+
| 7 | の場合 | 0 |
| 8 | 愛 | 0 |
| 9 | 遠くと近く | 0 |
| 10 | フラグメント | 0.9771181344985962 |
| 11 | 独り言 | 0 |
+----+-----------+--------------------+
セット内の 5 行 (0.02 秒)

-- BOOLEAN MODE を使用してクエリを組み合わせることができます。mysql> SELECT id, title FROM articles where MATCH ( content, title ) against ( '+风景-爱情' IN BOOLEAN MODE );
+----+--------+
| ID | タイトル |
+----+--------+
| 10 | フラグメント |
+----+--------+
セット内の1行(0.01秒)

-- クエリ拡張 (QUERY EXPANSION) は他の結果を関連付けることができます。mysql> SELECT id, title FROM articles where MATCH ( content, title ) against ( '风景' WITH QUERY EXPANSION );
+----+--------+
| ID | タイトル |
+----+--------+
| 10 | フラグメント |
| 11 | 独り言|
+----+--------+
セットに2行(0.02秒)
 

4. 単語分割エンジン

現在、公式サイトMeCab Full-Text Parserには、日本語をサポートする単語分割プラグインがあります(意味をよりよく理解できます)

フルテキスト パーサーが組み込まれています。英語のデフォルトの単語境界はスペースなので、英語のテキストを処理するときに、スペースを区切り文字として使用できます。しかし、中国語を処理する場合は、意味を理解して効果的な単語分割を行う必要があります。そのため、中国語、日本語、韓国語を処理する場合、MySQLはngramフルテキストを提供します(この記事の設定はngram中国語単語分割に基づいています)

要約する

アドバンテージ

  • 同様のクエリと比較すると、効率が向上します(特定のテストは行われていません)
  • 全文検索では複数のフィールドを同時にインデックスできますが、 のように検索できるのは単一のフィールドのみです。

中国語の単語分割では、効果的な単語分割を行う前に意味を理解する必要がある場合があります。たとえば、英語の単語 hello world はスペースで分割できますが、中国語の場合は、hello/world に分割する前に意味を理解する必要があります。

ここでは、中国語の単語分割の魅力を理解するのに役立つPythonでのjieba単語分割を共有します。

Jieba単語分割では、中国語の語彙を使用して、単語を構成する漢字間の関連確率を計算します。したがって、漢字間の確率を計算することで、単語分割の結果を形成できます。

[1]: インポートjieba

[2]: jieba.lcut("Hello World")
デフォルトの辞書からプレフィックス辞書を構築しています...
モデルをファイル キャッシュ /var/folders/st/b16fyn3s57x_5vszjl599njw0000gn/T/jieba.cache にダンプしています
モデルの読み込みには 0.937 秒かかりました。
プレフィックス辞書が正常に構築されました。
出力[2]: ['Hello', 'World']

[3]: jieba.lcut("hello world")
出力[3]: ['hello', ' ', 'world']

一般的なプロジェクトの場合、MySQL の全文インデックスは 80% のニーズを解決できます。中国語検索、自動単語分割、結果の並べ替え、複合クエリなどの機能を完璧にサポートできますが、パフォーマンスがボトルネックになるはずです。Elastissearch は、使いやすい方法で全文検索を実装できます。

フルテキスト インデックスでは、単語の分割により接続された文が複数の単語を形成するため、「like」の効果を実現できません。

参考文献

MySQL全文

以上がMySQL全文検索の使用例の詳細です。MySQL全文検索の使用に関する詳細については、123WORDPRESS.COMの他の関連記事にも注目してください。

以下もご興味があるかもしれません:
  • MySQL 5.7 での中国語全文検索の詳細な分析
  • MySQL フルテキスト検索の中国語ソリューションとサンプルコード
  • 全文検索とキーワードスコアリング方式のMySQL実装例
  • MySQL 5.7.25 全文検索チュートリアル

<<:  JavaScript配列の一般的なメソッドの詳細な説明

>>:  Docker に Zookeeper を素早くインストールする方法の詳細なチュートリアル

推薦する

Vue3 の ref と toRef の違いを簡単に分析します

1. refがコピーされ、ビューが更新されますrefを使用してオブジェクトのプロパティ値をレスポンシ...

数千万データを持つMySQLテーブルを最適化する実践記録

序文まずここで説明させてください。インターネット上では、Alibaba では 500 万のデータを異...

React 手書きタブ切り替え問題

親ファイル React をインポートし、{useState} を 'react' か...

...

mysql5.6.zip形式の圧縮版インストールグラフィックチュートリアル

はじめに: MySQL は、スウェーデンの MySQL AB によって開発されたリレーショナル デー...

MySQL 8.0.13 のインストールと設定のグラフィックチュートリアル

Msyqlデータベースのインストール、参考までに具体的な内容は次のとおりです。 ①ブラウザでhttp...

JavaScript setinterval 1秒遅延ソリューション

setinterval を使用すると、ページを開いた直後に 1 秒の遅延後に実行されることがわかりま...

jQueryはアコーディオンの小さなケースを実装します

この記事では、アコーディオンを実装するためのjQueryの具体的なコードを参考までに紹介します。具体...

MySQL データベースの型変換のための CAST 関数と CONVERT 関数の説明

MySQL のCAST()およびCONVERT()関数を使用すると、ある型の値を取得し、別の型の値を...

W3C チュートリアル (6): W3C CSS アクティビティ

スタイル シートは、ドキュメントの表示方法、発音方法、または入力方法を記述します。スタイル シートは...

Dockerイメージのローカル移行の実装

最近 Docker を勉強しているのですが、よく問題に遭遇します。Docker イメージをダウンロー...

spring-boot と docker-java に基づいて Docker コンテナの動的な管理と監視を実装します [完全なソース コードのダウンロード付き]

Docker入門Docker はオープンソースのアプリケーション コンテナ エンジンです。従来の仮...

Dockerコンテナのエクスポートとインポートの例

目次DockerコンテナのエクスポートDockerコンテナのインポ​​ートこの記事では主に、コンテナ...

MySQL マルチバージョン同時実行制御 MVCC の実装

トランザクション分離レベルの設定 グローバルトランザクション分離レベルを読み取りコミット済みに設定;...