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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

6回答

2311閲覧

MySQLとPHP:高速検索するアイデアをください

Razumerians

総合スコア25

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

0クリップ

投稿2016/12/05 04:46

編集2016/12/17 08:01

文章の中に特定の単語が含まれていないかを確認するWebアプリを作っています。

よろしくお願いいたします。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答6

0

全文検索ならElasticsearchをおすすめします

追記:
いい記事を見つけましたのでご紹介します
Elasticsearchを用いた日本語検索システムの理論と設定

投稿2016/12/05 06:19

編集2016/12/05 06:21
cat_breed

総合スコア123

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

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

0

例えば日本語全文検索に特化したエンジンを MySQL に組み込んで使う Mroonga なんてソリューションもあります。

投稿2016/12/05 05:34

tacsheaven

総合スコア13703

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

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

0

私は業務でMroongaを使ったことがあります。
普段MySQLを使っているなら、検討してみると良いと思います。結構手軽に使えるので。

ただし、Mroongaはデータの更新がバッティングすると結構な確率でインデックスが壊れるので、DB設計はしっかりやったほうが良いです。(テーブル定義の話ではなく、更新、参照のタイミングを要検討する。)

投稿2020/09/21 08:48

jouji78

総合スコア12

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

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

0

ベストアンサー

思いつきです。
想定されているケースが、$textよりも$tangoが多いので、$textを1文字で区切って分割し、分割された1文字から始まる$tangoを絞り込み、ヒットした$tangoで$text内をチェックするのが良いかと思いました。
説明するのが難しいですが・・・
以下の流れでしょうか。

1.対象の文字列を1文字で分割する
今回であれば、「今日田中くんと会いました」を配列等で「今 日 田 中 く ん と 会 い ま し た」と1文字で分割します。
分割して配列に入れると使い易そうと思いましたが、マルチバイトは面倒なのですね。
↓の方のを参考に分割する。
http://tricky-code.net/mine/php/mphp02.php

配列入れたものを、ついでにarray_unique等の関数で重複を除きます。

2.それぞれの文字列を$tangoに対して検索します。
適当にSQLのイメージですが、
select * from tango where tango_text like '今%' or tango_text like '日%' or tango_text like '田%' or ・・・(延々と続く)

3.上記でヒットしたワードに対し、$textでチェックする。

とすると、流れ的にも効率が良いのではと、思いました。

試しにニュースサイトの本文を1文字で分割した場合、800文字程度になりました。
単語でチェックするよりは良いかもしれませんと感覚的に思いました。(実際にやってみないと分かりませが)

投稿2016/12/05 14:40

yshima1129

総合スコア179

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

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

Razumerians

2016/12/17 08:01

ありがとうございます。
guest

0

検索対象の文章に対して大量のワードの部分一致検索ですか。
(禁止ワード検索とかでいろんなところで実績ありそうな気はします。)

回答でなくてすみません。私も興味あります。
SQLで以下のような感じで出来ればいいのですが、出来なさそうな気がします。

SQL

1select '私の名前は山田中です。' As sentence , word from wordList where sentence like CONCAT('%', wordList.word, '%');

とか

SQL

1select word from wordList; 2 3山田 4田中 5中村 6 7select '私の名前は山田中です。' As sentence, wordList.word As foundword from dual 8inner join wordList on sentence like CONCAT('%', wordList.word, '%'); 9 10sentence, foundword 11'私の名前は山田中です。', 山田 12'私の名前は山田中です。', 田中

投稿2016/12/05 07:03

Y.H.

総合スコア7914

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

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

0

高速化が重要なら全文検索にするか、分かち書きした上でキーワードを登録するかのどちらかでしょう

投稿2016/12/05 05:02

yambejp

総合スコア114843

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

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

Razumerians

2016/12/05 05:18

>高速化が重要なら全文検索にするか MySQL内で含有チェックさせる、みたいなイメージですか? >分かち書きした上でキーワードを登録する なるほど、ただどうして分かち書きすると高速化に繋がるのかいまいち掴めてないです ありがとうございます!
yambejp

2016/12/05 05:24

分かち書きすると、単語と完全一致検索ができます。 (全文検索も基本的には分かち書きの技術) RDBは原則インデックスを利用して高速な検索をするため 完全一致するものは高速に検索することが可能です。 一部一致検索する場合、前方一致や後方一致などであればある程度 インデックスが聞きますが、前方後方一致=あいまい検索は往々にして インデックスが聞きませんので、力技での検索となりスピードが遅くなります
yambejp

2016/12/05 05:25

聞く=効くですね
Razumerians

2016/12/05 05:34

ご丁寧にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問