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 を素早くインストールする方法の詳細なチュートリアル

推薦する

React Native環境のインストールプロセス

react-native インストールプロセス1.npx react-native init Awe...

純粋な CSS 実装 (スクリプトなし) HTML コマンド スタイルのツールチップ テキスト プロンプト効果

実行プロセスを分析します。マウスをノードに移動して、ノードにツールチップ実装を開くための識別子 (...

CSS3 で transform を使用した場合のフォントぼかしの解決方法の詳細な説明

この質問は非常に奇妙なので、あまり多くを語らずにコードに直接進みます。 .g-ダイアログラッパー{ ...

LinuxでTomcatのポート番号を変更する方法

ここには複数の Tomcat があります。それらを同時に使用する場合は、ポート番号を別の番号に変更す...

Tomcat セキュリティ仕様 (Tomcat セキュリティ強化と仕様)

tomcat はオープンソースの Web サーバーです。Tomcat ベースの Web は実行効率...

Nginx 運用保守ドメイン名検証方法例

インターフェイス ドメイン名を構成する際、各パブリック プラットフォームはドメイン名に対する開発者の...

Centos7 環境でバイナリ インストール パッケージから mysql5.6 をインストールする方法の詳細な説明

この記事では、centos7 環境でバイナリ インストール パッケージを使用して mysql5.6 ...

MySQL コード実行構造例の分析 [シーケンス、分岐、ループ構造]

この記事では、例を使用して MySQL コード実行構造について説明します。ご参考までに、詳細は以下の...

ウェブページを作成するために最もよく使用されるHTMLタグ

1. よく使われるHTMLタグの最適化HTML は Web 編集者にとって基本的なスキルであるべきで...

mysqlサーバーは--skip-grant-tablesオプションで実行されています

MySQLサーバーは--skip-grant-tablesオプションで実行されているため、このステー...

インライン要素とブロック要素とは何ですか?

1. インライン要素はコンテンツの幅のみを占めますが、ブロック要素はコンテンツの量に関係なく行全体を...

CSS と JavaScript を使用して管理ダッシュボードのレイアウトを構築するためのサンプル コード

あなたが作成するものこの新しいチュートリアルでは、CSS と JavaScript を使用して、レス...

MySQLクエリのソートとページング関連

概要通常、データベース内のデータを直接表示することは望ましくないため、最後の 2 つのセクションでは...

CSS3 フィルター (フィルタ) ウェブページのグレーまたは黒モードのサンプルコードを実現

フロントエンドcss3 フィルターは、Web ページのグレー効果を実現できるだけでなく、ナイト モー...