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

推薦する

ページリファクタリングスキル - コンテンツ

雑談はここまでにして、インターネット上で見つかる高性能な Yahoo ウェブサイトを構築するための数...

MySQL でのバイナリ型操作

この記事は主にMySQLデータベースのバイナリ型操作を紹介し、具体的な内容を通して紹介します。MyS...

Vue 監視属性のグラフィック例の詳細な説明

目次リスナープロパティとは何ですか?リスニングプロパティと計算プロパティの違いは何ですか?監視プロパ...

Vue はウェブページの言語切り替えの国際化を実装します

1. 基本的な手順1: yarn add vue-i18nをインストールするこのパスに新しい .js...

MySQL テーブル削除操作の実装 (delete、truncate、drop の違い)

この記事では主に、MySQL でテーブルを削除する 3 つの操作、つまり delete ステートメン...

JavaScript における継承の 3 つの方法

継承する1. 継承とは何か継承: まず、継承とは関係、つまりクラス間の関係です。JS にはクラスはあ...

バッテリー残量が少なくなったときに Linux を自動シャットダウンする方法

序文最近、私の住居の電力事情が不安定で、突然の停電が頻繁に起こります。ノートパソコンを持っているので...

VirtualBox CentOS7.7.1908 Python3.8 ビルド Scrapy 開発環境 [グラフィックチュートリアル]

目次環境CentOSをインストールするyum 国内ミラーソースを構成するサードパーティの依存関係をイ...

HTML と JavaScript を使用してローカル メディア (ビデオとオーディオ) ファイルを再生する方法

まず、セキュリティ上の理由から、JavaScript はローカル リソース ファイルに直接アクセスで...

画像ボタンをフォームのリセットボタンとして使用する方法

フォームを作成するときに、送信ボタンとリセットボタンを配置することがよくあります。ページの外観を考慮...

Linux でショートカットアイコンを設定する方法

序文Linux でショートカットを作成すると、アプリケーションをより速く開くことができます。ここで、...

jsはキャンバスに基づいて時計コンポーネントを実装します

圧縮アップロード画像、スクラッチカード、ポスター作成、チャートプラグインなど、フロントエンド開発にお...

Linux システムの .bash_profile ファイルの詳細な説明

目次1. 環境変数$PATH: 2. 環境変数を変更します。 3. bash_profileの目的要...

Vueルーティングコンポーネントでパラメータを渡す8つの方法の詳細な説明

シングルページアプリケーションを開発する場合、特定のルートを入力し、パラメータに基づいてサーバーから...

Linux で FastDFS を使用してイメージ サーバーを構築する

目次サーバー計画1. システムコンポーネントをインストールする2. fastdfsをインストールする...