表題の通りなのですが、実際の作業は以下の内容となります。
容量を取るのが勿体ないので、全文検索用カラムを設けずに実装していたのですが、
結果、2文字などの検索だと複数カラムでの全文検索だといい感じに動作しそうにないので
全文検索用カラムを作成する必要があるのかと思っておりますが、
そもそも以下の事象は、どういう理屈なのでしょうか?
また全文検索用カラムを追加しなくても出来るようであれば、なしで行きたいと思っております。
何卒よろしくお願いいたします。
DDL
title + content をして、全文検索用カラム fulltext_column を作ります。
CREATE TABLE `article` ( `seq` int NOT NULL AUTO_INCREMENT COMMENT '連番', `title` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT 'タイトル', `content` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT '本文', `fulltext_column` text CHARACTER SET utf8 COLLATE utf8_bin GENERATED ALWAYS AS (concat(`title`,_utf8mb3' ',`content`)) STORED, PRIMARY KEY (`seq`), FULLTEXT KEY `ftx_fulltext` (`fulltext_column`) /*!50100 WITH PARSER `ngram` */ , FULLTEXT KEY `title_content` (`title`,`content`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
#DML
INSERT INTO `article` (`seq`, `title`, `content`) VALUES (1, 'MySQL', 'MySQL(マイエスキューエル)は、オラクルが開発するRDBMS(リレーショナルデータベースを管理、運用するためのシステム)の実装の一つである。\r\nオープンソースで開発されており、GNU GPLと商用ライセンスのデュアルライセンスとなっている。\r\nMySQLは GPL とコマーシャルライセンスのデュアルライセンス方式で提供されている。 基本的に、MySQLのサーバ本体とクライアントライブラリはGPLで提供される。このため、MySQLを改造し、それを再頒布する場合は、GPLに従う必要がある。'), (2, 'PostgreSQL', 'PostgreSQL(ぽすとぐれすきゅーえる: 発音例)は、BSDライセンスに類似するライセンスにより配布されているオープンソースのオブジェクト関係データベース管理システム (ORDBMS) である。その名称は Ingres の後継を意味する「Post-Ingres」に由来している。単純に「Postgres」や「ポスグレ」と呼称されることも多い。\r\nPostgreSQL はバージョン 9.0 よりレプリケーションを標準でサポートするが、サードパーティー製のオプション・ソフトウェアも利用できる。\r\nFermion、検索および更新処理の負荷分散、自動フェイルオーバー機能、マルチキャストを用いたノードの自動追加処理機能を備える。'), (3, 'Microsoft SQL Server', 'Microsoft SQL Server (マイクロソフト エスキューエル サーバ)とは、マイクロソフトが開発している、リレーショナルデータベース管理システム (RDBMS)である。略称は「SQL Server」または「MS SQL」などと呼ばれている。主要な問い合わせ言語 (クエリ言語)は、T-SQLとANSI SQLである。\r\n企業サーバ向けの高機能なシステムから、組み込み系の小規模なシステムまで幅広く対応する。またMicrosoft Windowsと親和性が高く、ADOやADO.NETを経由して最適なバックエンドデータベースを構築できるようになっている。');
#確認1 fulltext_column で検索
SELECT seq FROM article WHERE (MATCH (fulltext_column) AGAINST ('オラ' IN NATURAL LANGUAGE MODE));
#結果1
seq ------- 1
1件あり
#確認2 title,content で検索
SELECT seq FROM article WHERE (MATCH (title,content) AGAINST ('オラ' IN NATURAL LANGUAGE MODE));
#結果2
結果なし
#番外
検索ワードを "SQL" で同様に検索すると、
fulltext_column だと1,2,3 が検索される。
title,content だと3 が検索される。
はて???
#環境
8.0.23
参考URL:
https://qiita.com/ArimaRyunosuke/items/7b74316c03ef02276675
回答1件
あなたの回答
tips
プレビュー