質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

3367閲覧

mysqlの全文検索で複数カラムを統合した全文検索用カラムと複数カラムで検索した結果が違うのは、なぜでしょうか?

akasatanaha

総合スコア44

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

3クリップ

投稿2021/08/24 07:44

編集2021/08/24 09:32

表題の通りなのですが、実際の作業は以下の内容となります。
容量を取るのが勿体ないので、全文検索用カラムを設けずに実装していたのですが、
結果、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/08/24 08:00

バージョンも記載願います。
akasatanaha

2021/08/24 09:18

すみません。追記いたしました。
guest

回答1

0

ベストアンサー

どうやらparserの問題のようです

SQL

1FULLTEXT KEY `title_content` (`title`,`content`) 2↓↓↓ 3FULLTEXT KEY `title_content` (`title`,`content`) WITH PARSER ngram

投稿2021/08/25 00:29

yambejp

総合スコア116443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2021/08/25 00:38

https://qiita.com/ArimaRyunosuke/items/7b74316c03ef02276675 とかを参考にしたのでしょうか? 生成列にngramを「/*!50100 WITH PARSER `ngram` */」で設定しているようですね (原理はよく理解していないので説明できませんが) リアルなカラムに対してngramを指示する場合は普通にオプションを指定すればよいようです
akasatanaha

2021/08/25 02:43

ご回答ありがとうございます! ご指摘の通りの方法で対応出来ました。 ありがとうございます。 ↑のサイトを参考にいたしました。 あーサイトにも書いてありますね・・・。 試したときは見た記憶があるけど、複数カラムのインデックスを作成するときに抜け落ちてました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問