都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

『 昨日から片頭痛ある 』、『 昨日から頭痛がある 』という文がCONTAINS 関数で『 頭痛 』を指定すると、『 昨日から片頭痛ある 』という文がヒットしないので、なんとかヒットさせる術がないかどうか悩んでみたり、色々な人にヒアリングしたけど、やっぱりワードブレーカーを作る暇はないので、少し格好悪いけど『アノ』案でいくことに決めたので、内容をまとめてみた..けどもう少しフルテキストの機能を説明したいと思ったので、土曜日の朝っぱらから記事書いてみた

今回やることを説明してみる

 最近、SQL Server全文検索についていくつか記事を書きました。

『 昨日から片頭痛ある 』、『 昨日から頭痛がある 』という文がCONTAINS 関数で『 頭痛 』を指定すると、『 昨日から片頭痛ある 』という文がヒットしないので、なんとかヒットさせる術がないかどうか悩んでみたり、色々な人にヒアリングしたけど、やっぱりワードブレーカーを作る暇はないので、少し格好悪いけど『アノ』案でいくことに決めたので、内容をまとめてみた っていう記事を書いたけど、.NET からMeCab をどうやって使っていいのかわからないので、調査してみた - 都内で働くSEの技術的なひとりごと

『 昨日から片頭痛ある 』、『 昨日から頭痛がある 』という文がCONTAINS 関数で『 頭痛 』を指定すると、『 昨日から片頭痛ある 』という文がヒットしないので、なんとかヒットさせる術がないかどうか悩んでみたり、色々な人にヒアリングしたけど、やっぱりワードブレーカーを作る暇はないので、少し格好悪いけど『アノ』案でいくことに決めたので、内容をまとめてみた - 都内で働くSEの技術的なひとりごと

『 昨日から片頭痛ある 』、『 昨日から頭痛がある 』という文がCONTAINS 関数で『 頭痛 』を指定すると、『 昨日から片頭痛ある 』という文がヒットしないので、なんとかヒットさせる術がないかどうか悩んでみる - 都内で働くSEの技術的なひとりごと
上記の記事では下記の二つの文を用いて検証をしました。

  • 昨日から頭痛がある。
  • 昨日から片頭痛がある。

これに、下記の文も加えてみます。

  • 昨日から頭痛がある。仕事の片をつけた23時ごろから頭痛がした。

上記の三つの文が存在する場合、前回までの方式で『片頭痛』と検索条件を指定すると、以下の二つの文がヒットしてしまいます。

  • 昨日から片頭痛がある。
  • 昨日から頭痛がある。仕事の片をつけた23時ごろから頭痛がした。

片頭痛だけヒットさせたいのですが、そのような結果にはなりません。では、どのようにしたらいいでしょうか?

使用する環境を説明してみる

 使用していた Windows 8.1 マシンがお亡くなりになったので、急遽 Lenovo マシンに SQL Server 環境を展開しました。↓このマシンです。

現在の検証環境 - 都内で働くSEの技術的なひとりごと
そういえば、最近 Lenovo から Yoga Pro3 が発表されましたね。

※いいスペックだなぁ。ほしいなぁ。色はプラチナシルバーかな。Office も 365 になってますね。今時な感じします。あ、SSD も 512GB になってる。自分へのXmasプレゼントにしようかな...怒られるよな。

早速ためしてみる

 Yoga のことはおいといて、早速検証してみましょう。まず、下記の三つの文を テーブルに格納しましょう。

  • 昨日から頭痛がある。
  • 昨日から片頭痛がある。
  • 昨日から頭痛がある。仕事の片をつけた23時ごろから頭痛がした。

テーブルレイアウトなどは、下記の記事内容と同一としています。

『 昨日から片頭痛ある 』、『 昨日から頭痛がある 』という文がCONTAINS 関数で『 頭痛 』を指定すると、『 昨日から片頭痛ある 』という文がヒットしないので、なんとかヒットさせる術がないかどうか悩んでみる - 都内で働くSEの技術的なひとりごと
検索方式は、下記の記事内容と同一とします。

『 昨日から片頭痛ある 』、『 昨日から頭痛がある 』という文がCONTAINS 関数で『 頭痛 』を指定すると、『 昨日から片頭痛ある 』という文がヒットしないので、なんとかヒットさせる術がないかどうか悩んでみたり、色々な人にヒアリングしたけど、やっぱりワードブレーカーを作る暇はないので、少し格好悪いけど『アノ』案でいくことに決めたので、内容をまとめてみた - 都内で働くSEの技術的なひとりごと
それぞれの文を MeCab で形態要素解析してみましょう。

  • 昨日 から 頭痛 が ある 。
  • 昨日 から 片 頭痛 が ある 。
  • 昨日 から 頭痛 が ある 。仕事 の 片 を つけ た 23 時 ごろ から 頭痛 が した 。

上記の結果を SQL Server に格納します。
f:id:koogucc11:20141108090612p:plain
 まず、下記のクエリを実行してみましょう。片頭痛だけヒットさせたいのですが、仕事の片をつけたらの片がヒットしてしまいます。

USE TestDB
SELECT * FROM dbo.TestTable WHERE CONTAINS(col2,'"片*" AND "頭痛*"');

f:id:koogucc11:20141108090717p:plain
 上記の問題を解決するには、NEAR 句を使用することで解決できます。下記のクエリを実行すると、『 片 』の0語以内に『 頭痛 』という単語が存在する文のみがヒットします。

USE TestDB
SELECT * FROM dbo.TestTable WHERE CONTAINS(col2,'NEAR(("片*","頭痛*"),0)');

f:id:koogucc11:20141108090814p:plain

おわりに何か書いてみる

 当然ながらこのくらいのことは十分実現できます。それ以外にも SQL Server のフルテキスト検索は様々な機能を持っています。フルテキスト検索については、今後も時間があるときに色々と説明していきます。