『 昨日から片頭痛ある 』、『 昨日から頭痛がある 』という文がCONTAINS 関数で『 頭痛 』を指定すると、『 昨日から片頭痛ある 』という文がヒットしないので、なんとかヒットさせる術がないかどうか悩んでみたり、色々な人にヒアリングしたけど、やっぱりワードブレーカーを作る暇はないので、少し格好悪いけど『アノ』案でいくことに決めたので、内容をまとめてみた..けどもう少しフルテキストの機能を説明したいと思ったので、土曜日の朝っぱらから記事書いてみた
今回やることを説明してみる
最近、SQL Server の全文検索についていくつか記事を書きました。
『 昨日から片頭痛ある 』、『 昨日から頭痛がある 』という文がCONTAINS 関数で『 頭痛 』を指定すると、『 昨日から片頭痛ある 』という文がヒットしないので、なんとかヒットさせる術がないかどうか悩んでみたり、色々な人にヒアリングしたけど、やっぱりワードブレーカーを作る暇はないので、少し格好悪いけど『アノ』案でいくことに決めたので、内容をまとめてみた っていう記事を書いたけど、.NET からMeCab をどうやって使っていいのかわからないので、調査してみた - 都内で働くSEの技術的なひとりごと
『 昨日から片頭痛ある 』、『 昨日から頭痛がある 』という文がCONTAINS 関数で『 頭痛 』を指定すると、『 昨日から片頭痛ある 』という文がヒットしないので、なんとかヒットさせる術がないかどうか悩んでみたり、色々な人にヒアリングしたけど、やっぱりワードブレーカーを作る暇はないので、少し格好悪いけど『アノ』案でいくことに決めたので、内容をまとめてみた - 都内で働くSEの技術的なひとりごと
『 昨日から片頭痛ある 』、『 昨日から頭痛がある 』という文がCONTAINS 関数で『 頭痛 』を指定すると、『 昨日から片頭痛ある 』という文がヒットしないので、なんとかヒットさせる術がないかどうか悩んでみる - 都内で働くSEの技術的なひとりごと
上記の記事では下記の二つの文を用いて検証をしました。
- 昨日から頭痛がある。
- 昨日から片頭痛がある。
これに、下記の文も加えてみます。
- 昨日から頭痛がある。仕事の片をつけた23時ごろから頭痛がした。
上記の三つの文が存在する場合、前回までの方式で『片頭痛』と検索条件を指定すると、以下の二つの文がヒットしてしまいます。
- 昨日から片頭痛がある。
- 昨日から頭痛がある。仕事の片をつけた23時ごろから頭痛がした。
片頭痛だけヒットさせたいのですが、そのような結果にはなりません。では、どのようにしたらいいでしょうか?
使用する環境を説明してみる
使用していた Windows 8.1 マシンがお亡くなりになったので、急遽 Lenovo マシンに SQL Server 環境を展開しました。↓このマシンです。
現在の検証環境 - 都内で働くSEの技術的なひとりごと
そういえば、最近 Lenovo から Yoga Pro3 が発表されましたね。
- 出版社/メーカー: Lenovo
- 発売日: 2014/11/28
- メディア: Personal Computers
- この商品を含むブログを見る
- 出版社/メーカー: Lenovo
- 発売日: 2014/11/28
- メディア: Personal Computers
- この商品を含むブログを見る
- 出版社/メーカー: Lenovo
- 発売日: 2014/11/28
- メディア: Personal Computers
- この商品を含むブログを見る
早速ためしてみる
Yoga のことはおいといて、早速検証してみましょう。まず、下記の三つの文を テーブルに格納しましょう。
- 昨日から頭痛がある。
- 昨日から片頭痛がある。
- 昨日から頭痛がある。仕事の片をつけた23時ごろから頭痛がした。
テーブルレイアウトなどは、下記の記事内容と同一としています。
『 昨日から片頭痛ある 』、『 昨日から頭痛がある 』という文がCONTAINS 関数で『 頭痛 』を指定すると、『 昨日から片頭痛ある 』という文がヒットしないので、なんとかヒットさせる術がないかどうか悩んでみる - 都内で働くSEの技術的なひとりごと
検索方式は、下記の記事内容と同一とします。
『 昨日から片頭痛ある 』、『 昨日から頭痛がある 』という文がCONTAINS 関数で『 頭痛 』を指定すると、『 昨日から片頭痛ある 』という文がヒットしないので、なんとかヒットさせる術がないかどうか悩んでみたり、色々な人にヒアリングしたけど、やっぱりワードブレーカーを作る暇はないので、少し格好悪いけど『アノ』案でいくことに決めたので、内容をまとめてみた - 都内で働くSEの技術的なひとりごと
それぞれの文を MeCab で形態要素解析してみましょう。
- 昨日 から 頭痛 が ある 。
- 昨日 から 片 頭痛 が ある 。
- 昨日 から 頭痛 が ある 。仕事 の 片 を つけ た 23 時 ごろ から 頭痛 が した 。
上記の結果を SQL Server に格納します。
まず、下記のクエリを実行してみましょう。片頭痛だけヒットさせたいのですが、仕事の片をつけたらの片がヒットしてしまいます。
USE TestDB SELECT * FROM dbo.TestTable WHERE CONTAINS(col2,'"片*" AND "頭痛*"');
上記の問題を解決するには、NEAR 句を使用することで解決できます。下記のクエリを実行すると、『 片 』の0語以内に『 頭痛 』という単語が存在する文のみがヒットします。
USE TestDB SELECT * FROM dbo.TestTable WHERE CONTAINS(col2,'NEAR(("片*","頭痛*"),0)');
おわりに何か書いてみる
当然ながらこのくらいのことは十分実現できます。それ以外にも SQL Server のフルテキスト検索は様々な機能を持っています。フルテキスト検索については、今後も時間があるときに色々と説明していきます。