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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

2回答

4401閲覧

全文検索をしたいです

microsurf

総合スコア1

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2020/06/05 05:47

編集2020/06/05 08:53

実現したいこと

全文検索を実現したいです。

以下素人の試行錯誤が続きお見苦しい点もあるかと思いますが、よろしくお付き合いくださいませ。

該当のソースコード

こちらで取得できませんでした。

sql

1SELECT p.title 2FROM t_post p 3WHERE MATCH(p.title) AGAINST('+太陽 +地球 ' IN BOOLEAN MODE);

試したこと

まず確認したこととして、テーブル定義と現状の値をエクスポートして以下となります。

sql

1CREATE TABLE `t_post` ( 2 `id` INT(2) UNSIGNED NOT NULL AUTO_INCREMENT, 3 `name` VARCHAR(1) NOT NULL, 4 `title` VARCHAR(10000) NOT NULL, 5 FULLTEXT KEY(title), 6 PRIMARY KEY (`id`) 7) ENGINE=InnoDB DEFAULT CHARSET=utf8; 8 9INSERT INTO `t_post` (`name`,`title`) VALUES 10('a', 'あおいうえお'), 11('b', 'かきくけ地球こ'), 12('c', 'さしす地球せそ太陽');

上記CREATとINSERTと先のSELECTの3つについて、SQLが試せるサイト(paiza)にて実行しましたが、やはり取得できません。つまり私の環境だけの問題ではないことがわかりました。

調べていくうちに、CREATEを下記のようにNGRAMにすることで、paizaで取得が実現できました。

sql

1# FULLTEXT KEY(title), 2FULLTEXT KEY(title) WITH PARSER NGRAM,

これがわかったところで、paizaでなく自分の環境でNGRAMを追加すべく以下を実行しました。

sql

1ALTER TABLE t_post add fulltext( title ) WITH PARSER NGRAM;

そうしますと下記エラーが出ました。

sql

1SQL クエリ: 2ALTER TABLE t_post add fulltext( title ) WITH PARSER NGRAM 3 4MySQL のメッセージ: ドキュメント 5#1128 - 関数 'NGRAM' は定義されていません。

どうやらNGRAMが自分の環境では使えないのかと思い行き詰りました。

このエラーが出た場合、全文検索は不可能でしょうか?もしできる方法があったらお尋ねしたいです。
どうぞ宜しくお願い致します。

ツールのバージョン

バージョンについてですが、NGRAMはMySQL5.7からしか使えないとの情報を得たのでMySQLのバージョンを確認しようと思いました。

しかしselect version();の実行では10.0.33-MariaDBとしか表示されず、5.7以上なのかどうなのかがわかりません。

そしてphpMyAdminの画面上から確認しようと思ったのですが、以下のようにホーム画面にバージョン情報が載っておらずやはりわかりませんでした。
イメージ説明
###追記
上記のように10.0.33-MariaDBという環境を前提とさせて頂きます。この環境下で全文検索をしたいというのが目的です。

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

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

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

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

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

sazi

2020/06/05 06:10

変更すべきはインデックスなので、一からcreateしなおせば良いのでは。
microsurf

2020/06/05 06:21

一からCREATEしなおせばエラーは出なそうでしょうか。しかしデータを消すのがかなりつらいです。現状のCREATEを消すことなく、ALTER TABLEのようにできないものでしょうか。
sazi

2020/06/05 07:06

質問のalter文はカラムを変更しようとしているように見えて、インデックスを追加している様には見えないけど。
sazi

2020/06/05 07:10 編集

やるなら、 ALTER TABLE テーブル名 ADD FULLTEXT INDEX `インデックス名` (カラム名) WITH PARSER ngram; みたいな感じ。
microsurf

2020/06/05 07:15

ALTERはそう書くのですね。ありがとうございます。 しかしそちら実行しましたが、質問と同じように以下のエラーでした。 SQL クエリ: ALTER TABLE t_post ADD FULLTEXT INDEX t_post_01 (title) WITH PARSER ngram MySQL のメッセージ: ドキュメント #1128 - 関数 'NGRAM' は定義されていません。
sazi

2020/06/05 07:30

テーブル名を変えてcreateしてみてください。 エラーになるようなら、DB再構築した方が早いかも。
microsurf

2020/06/05 08:18

なるほど、別テーブルをCREATEすればいいですね。 試しましたら以下エラーでして、どうやら私のMySQLでは使えないみたいです。 Function 'ngram' is not defined それにしても、MySQLのバージョンはどうやって確認したらいいのかご存じないでしょうか?バージョンのせいで使えないのか、ほかの要因なのかを切り分けたいです。
microsurf

2020/06/05 08:32 編集

select version();による10.0.33-MariaDBという表示は、MySQLではなかったのですか。ありがとうございます。相当混乱しておりました。そしてリンク先によれば10.0.33-MariaDBはMySQL5.5相当とのことで、ということは、MySQL5.7からしか使えないNGRAMは使えないと考えるのが妥当そうですね。参りました…全文検索は不可能そうでしょうか?
microsurf

2020/06/05 08:32

NGRAMがなくてもできる方法などもしございましたら…
sazi

2020/06/05 08:42 編集

回答しておきます。 この際Ngramかどうかは抜きにしてFULLTEXTで検索できればいいんでしょうから、バージョンを上げればどう?て感じです。
microsurf

2020/06/05 08:45

レンタルサーバーなのでバージョンを上げることが難しそうです。 そしてせっかくご回答いただいたのですが、その方法では取得できないというのが質問になります。 実際にご回答の「https://qiita.com/kumasun/items/3ce5523e5dd3d79665af#fulltext%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AE%E5%BC%B5%E3%82%8A%E6%96%B9」にあるALTER TABLEを実行して、その結果が「試したこと」にあるCREATE文になるわけですが、ここにはNGRAMがないために取得できないと思います。
sazi

2020/06/05 08:49

レンタルサーバーの制限があるなら使える環境は何なんでしょう? そこが出発点ですよね。
microsurf

2020/06/05 08:52

10.0.33-MariaDBの環境下とさせて頂きます。ここにおいて全文検索ができればと思います。
guest

回答2

0

ベストアンサー

NGRAMがなくてもできる方法などもしございましたら…

以下参考
MariaDBの全文検索を試したら感動した話
MySQL(Maria DB)で全文検索 (FULLTEXT INDEX) を使用する

投稿2020/06/05 08:36

編集2020/06/05 08:44
sazi

総合スコア25327

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

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

microsurf

2020/06/05 08:43

参考ありがとうございます。 そちらのリンクにある ALTER TABLE `sometable` ADD FULLTEXT(` somerow `); を使って ALTER TABLE t_post ADD FULLTEXT(title); を実行したのが「試したこと」にあるCREATE TABLEでした。 ですがそれでは「試したこと」にあるように、paizaや自分の環境で実行しても取得できません。 そこでNGRAMを追加したという経緯がございます。
sazi

2020/06/05 08:46

そもそもpaizaと、ご自身の環境が同じかどうかの確認をとっていないからおかしくなっています。 paizaで試すより自身で作成した環境を基準にして下さい。
sazi

2020/06/05 08:50

レンタルサーバーで制限があるとの事ですが、その前提条件を質問で明確にしておいて下さいね。
microsurf

2020/06/05 08:51

自身の環境ではできません。そのためにpaizaで実行した内容を質問として投稿した経緯です。 そしてリンク先にはCREATE文がなく、実現できる環境が非掲載なため、真似ようがないとった状況です。
microsurf

2020/06/05 08:52

>レンタルサーバーで制限があるとの事ですが、その前提条件を質問で明確にしておいて下さいね。 失礼しました。バージョンは10.0.33-MariaDBとし、前提条件とさせていただくこと、質問に明記いたします。
sazi

2020/06/05 08:52

ご自身のPCにレンタルサーバーで制限されているバージョンのDBの構築が出来ないのですか?
microsurf

2020/06/05 08:55

やったことがございませんが、得られるものによっては試したいと思います。それによって何が得られるのでしょうか?「10.0.33-MariaDBの環境下で、NGRAMが使えないのは本当かどうか、自分のPCで試す」ということですか?
sazi

2020/06/05 09:00 編集

>「10.0.33-MariaDBの環境下で、NGRAMが使えないのは本当かどうか、自分のPCで試す」 ではなく、「全文検索可能な情報を得たら可能かどうかを自身の環境で試す」です。 すでに出来上がっている環境では無く、地震で構築した環境なら構成を見落とす可能性は低くなりますから
microsurf

2020/06/05 09:00

いろいろな方向でありがとうございます。実はそちらyambejp様のご回答もあり試したのですが、以下エラーとなりハードルが高そうに感じたために避けてしまいました。 Static analysis: 解析中に 1 個のエラーが見つかりました。 Unrecognized statement type. (near "INSTALL" at position 0) SQL クエリ: INSTALL PLUGIN Mroonga SONAME 'ha_mroonga.so' MySQL のメッセージ: ドキュメント #1142 - コマンド INSERT は ユーザー 'live_h7yu28'@'10.1.32.8' ,テーブル 'plugin' に対して許可されていません
sazi

2020/06/05 09:06 編集

レンタルサーバーで行っていますか? 権限が与えられていないか、そもそもリソースは配置されていないのかもしれません。 全文検索はDisk資源も使いますので、制限掛けられて使えないサバ―とかもあったりします。 構築が難しいようなら、制限のないサーバーに変えるのも、選択肢ですよ。
microsurf

2020/06/05 09:22 編集

はい、レンタルサーバーです。やはりそういう意味のエラーでしたか。このレンタルサーバーではどうしようもなさそうですね。 仰る通りレンタルサーバーを変えた方がいいかもしれませんが、今回は手間に鑑みてひとまずLIKE検索でしのいでおきます。なんどもやりとりして頂いて本当にありがとうございました。
guest

0

普通にできそうですけどね・・・

投稿2020/06/05 06:12

yambejp

総合スコア116724

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

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

yambejp

2020/06/05 06:12

CREATE TABLE `t_post` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(1) NOT NULL, `title` TEXT NOT NULL, FULLTEXT (title) WITH PARSER ngram ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `t_post` (`name`,`title`) VALUES ('a', 'あおいうえお'), ('b', 'かきくけ地球こ'), ('c', 'さしす地球せそ太陽'); SELECT title FROM t_post WHERE MATCH(title) AGAINST('+太陽 +地球' IN BOOLEAN MODE);
microsurf

2020/06/05 07:16 編集

質問にもございますが、そちらのコードが動くことはpaizaで確認済みでして… 今回質問させて頂いておりますのは、ngramが自分の環境でできないことについてになります。
yambejp

2020/06/05 08:05

MySQLを上位にアップデートできないなら mroongaなどで凌ぐしか無いでしょう。
microsurf

2020/06/05 09:23 編集

結局レンタルサーバーに問題ありのようで、実現できないと結論しました。ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問