目次
先日は「検索システムを構成するパーツ」ということで検索システムを構成しているパーツについて書いてみました。
大体、検索がうまくヒットしないといった場合に、問題になるのがコンテンツ自体のデータもしくは、転置インデックスのキーワードだったりします。 そこで今回は、前回のパーツの「データソース・コンテンツ」周りについて少し書いてみようと思います。言葉の定義、それぞれがどんなことをやるのか、とりあえず導入したあとにコンテンツ周りでどんな改善ができるかなどを書いてみます。
言葉の定義
コンテンツ
実際に検索させたいデータになります。 コンテンツにはWebページ、データベースのレコード(CMSで登録されたデータなど)、ファイルサーバーにある文書(PDF、Word、Excelなど)などになります。
データソース
コンテンツのマスタデータが保存されている先です。 よくあるデータソースとしては以下のものが考えられます。
- Webサイト - 自社もしくはインターネットに存在しているWebサイトです。
- ファイルサーバー - ローカルネットワーク上のファイルサーバーもありますが、最近ではGoogle DriveやDropboxといった外部のWebサービスもあります。
- RDB - CMSや自社システムでのデータの保存先です。
クローラー
コンテンツをデータソースから収集してくるプログラムのことです。 Webサイトやファイルサーバーからコンテンツを収集して検索エンジンに登録するところまでを担当します。 RDBにあるデータを検索エンジンに登録する場合はクローラーがデータを登録するというよりは、RDBにデータを登録するシステムが検索エンジンに登録する機能を持っていることが多いです。
データの収集と登録
収集
クローラーを使用した収集の場合は、サービスの特性とデータソースによって、どの程度の頻度でクロールするのか、クロール対象はどこまでか?といったものを決める必要が出てきます。 これらが決まれば収集ができるかと(他に権限とかもありますが。)。 収集コンテンツは、そのままでは利用しにくかったり、利用できないことがあるので、次はデータの変換を行います。
データ変換
コンテンツはそのままの形では検索エンジンには扱いにくいデータ形式である場合があります。
Webページの場合
Webページの場合、コンテンツにはHTMLタグが入っていたり、JavaScriptなど検索対象にはしたくないデータなどが入っています。これらを除去して、検索させたいものを取り出す必要があります。 また、Titleタグなど、いくつかメタデータとして扱えるものがHTMLで規定されているので、これらを別の項目として取り出して個別に検索できるようにすると便利です。 HTMLをパースしてデータを抜き出す処理ができるライブラリなどがあるので活用します。
ファイル
PDFファイルなど、ファイルの場合もメタデータと呼ばれるファイル自体が持っている情報が存在します。作成者、更新日時、ファイル名、パスなどです。 これらも検索時に有効な情報になります。 また、ファイルから文字列を抜き出す処理も必要になります。 それぞれデータフォーマットが異なりますので、そのフォーマットに合わせて文章データを抜き出す処理が必要です。OSSや製品がありますので、それらを利用して、ファイルから文章を抜き出します。
RDB
RDBのデータの場合、データが正規化されています。 検索エンジンでは、非正規化のデータを登録して検索することが基本となるため、まずは非正規化して取り出す必要が出てきます。
例えば、ジャンルやカテゴリ、各種IDなどが実際のコンテンツのレコードに入っていると思いますが、これらをユーザーが入力したキーワードで検索したい場合などは、IDではなく表示名を取り出して、検索エンジンに登録する必要が出てきます。
その他
データごとの変換処理について説明しました。 その他に、データのクリーニング処理などと言ったことも必要になってきます。例えば、HTMLのタイトルに必ずサイト名が入っているが、除去したいといった場合や、検索エンジン固有のデータの前処理などもあります。
登録
最後は検索エンジンへの登録です。 最近の検索エンジンはJSON形式でデータを受け取る場合が多いので、JSONに変換することが多いです。 基本的には各種プログラミング言語のライブラリが用意されているのでこれらを利用するのが基本となります。
検索したい項目、検索させたい方法などを洗い出し、必要なデータを作成して検索エンジンに登録します。 登録と書いていますが、更新、削除などもここでの対象となります。
ここまでの流れで、データソースからコンテンツを取得し、変換して、検索エンジンへの登録が終わりました。
検索の改善
検索のログから分析して改善していくのが良いですが、ユーザーからの質問や意見などからも改善すべき点が見えてくると思います。 検索ログでは、次のようなものを元に、検索がうまく行かないものを見つけ出します。
- 0件ヒット
- 0件クリック
ヒットしていない検索ワードがある場合、コンテンツに問題がある場合があります。まずはこのあたりをとってみるのが良いかと。 そもそも、入力されたキーワードにマッチするコンテンツを扱っていないこともわかりますし、入力されたキーワードに似た単語を持ったコンテンツなども存在するはずです。 類義語の辞書を用意して、検索にヒットできるようにするといった分析と改善にも利用できます。
あとは、検索エンジン側の話ですが、形態素解析器などを利用している場合に、意図した区切りになっていないために、うまくキーワードがヒットしないと言ったこともあります。
コンテンツの理解
実はこれが一番だったりします。 どんなコンテンツを自分たちが扱っているのか?どんなデータがどういった項目でコンテンツに入っているのか?といったところから、 コンテンツのデータを元に検索にヒットさせる方法が改善できます。
CMSなど人が入力したデータをコンテンツとして扱う場合、入力画面を改良することで、望んでいるデータを入れてもらえたり、不要なデータが入らなくなる可能性があります。 例えば、ECサイトなどで商品の説明文やタイトルにいろいろなキーワードが入っている場合などがあります。むりやりどんなキーワードでもヒットさせたいという入力者の意図もあるのですが、検索しているユーザーにはノイズになることも多いです。適切にカテゴリやジャンル、属性といった項目に分けることでおかしな入力データを減らすことも可能です。
Webサイトなどをクローリングしたものの場合は、サイトごとに文章の特徴があったり、重複している部分などが合ったりする場合があります。 これらもコンテンツをよく調べることで、不要な情報を除去したりといったことが可能になります。
まとめ
簡単ですが、検索のデータソースやコンテンツにまつわる話を紹介しました。 もちろんここでは紹介しきれていない項目がいっぱいあります。 また、具体例ではなく概略をざっくりと書いているのでわかりにくい場合もあるかもしれません。 すこしユースケースを絞り込んで書いたほうがわかりやすくなるのかも?
次はUIとか書くかも?
不明点とか疑問点、指摘事項などあればコメントしていただければと。 要望などもお待ちしております。
comments powered by Disqus
See Also by Hugo
- 検索システムを構成するパーツ(検索システムに関する妄想その2)
- OpenSearchのderivedフィールドタイプについて
- システムの特徴と検索機能について(検索システムに関する妄想その1)
- Oramaという検索エンジンでブログ検索を作ってみた
- Windowsをお試し中