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単語分割を共有します。
[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の他の関連記事にも注目してください。 以下もご興味があるかもしれません:
|
<<: JavaScript配列の一般的なメソッドの詳細な説明
>>: Docker に Zookeeper を素早くインストールする方法の詳細なチュートリアル
1. Dockerをインストールする1. 仮想マシンに Centos7 をインストールしました。Li...
一時テーブルの概要一時テーブルとは: MySQL は中間結果セットを保存するために使用されます。一時...
目次序文グローバルパラメータの永続性最後に要約する参考資料:序文2018 年に MySQL 8.0....
目次序文Lua スクリプトnignx.conf の設定Dockerfileの設定序文データベースやそ...
最近、「フロントエンドキャッシュ」という新しい要件が作成されました要件背景: フォームへの高頻度の繰...
コンテンツ詳細タグ: <h1>~<h6>タイトルタグ<pre>テ...
<br />条件付きコメントはIEシリーズ製品上でXHTMLコード処理を分離して行うこと...
nofollowをめぐる論争Zac と Guoping の間では、nofollow が PR を無駄...
何?何のスターコートですか?さて、もっとわかりやすくするために写真を見てみましょう。 よく見ると、パ...
画像タグは、Web ページに画像を表示するために使用されます。 HTML/XHTML 画像 <...
まずはレンダリングを見てみましょう: XML/HTML コードコンテンツをクリップボードにコピー&l...
ソースからApacheをインストールする1. Apacheソースコードをアップロードして必要なソフト...
序文: Vueプロジェクトで透かし効果を使用するには、コンテナを指定できます効果画像: 1. コンテ...
質問今日、プロジェクト関数を書いていたとき、金額の統計計算を行い、単位を変換する必要がありました。そ...
序文MySQL をインストールすると、通常はスーパーユーザー root を作成します。多くの人がこの...