日記

検索エンジニアになりたい

スクレイピングしてURLを取得する

検索結果を表示するときにそのページのURLが必要となる。
f:id:sakura818uuu:20160508023320p:plain


ここではWikipediaのグーグル紹介ページ(Google - Wikipedia)のURLをスクレイピングして取得した。言語はPython3,ライブラリはbeautifulsoupを使用した。

from bs4 import BeautifulSoup
from urllib.request import urlopen
import re

html = urlopen("https://ja.wikipedia.org/wiki/google")
bsObj = BeautifulSoup(html.read())

for link in bsObj.findAll("link",rel="canonical"):
  if 'href' in link.attrs:
    print(link.attrs['href'])

実行すると以下のようになる。
f:id:sakura818uuu:20160508023713p:plain

スクレイピングしてタイトルを取得する

検索結果を表示するときにそのページのタイトルが必要となる。

f:id:sakura818uuu:20160508021608p:plain


ここではWikipediaのグーグル紹介ページ(Google - Wikipedia)のタイトルをスクレイピングして取得した。言語はPython3,ライブラリはbeautifulsoupを使用した。

from bs4 import BeautifulSoup
from urllib.request import urlopen
import re

html = urlopen("https://ja.wikipedia.org/wiki/google")
bsObj = BeautifulSoup(html.read())

print(bsObj.title)

実行すると以下のようになる。
f:id:sakura818uuu:20160508022435p:plain

タイトルタグを除去できていないため修正する必要がある。

検索エンジンのしくみ

全文検索エンジンにはgrep型とインデックス型の2種類がある。

grep型とはコマンドのgrepと同じで文字列を最初から順番に検索していく方法。逐次検索型ともいう。

インデックス型とはあらかじめインデックスを作成しておきそこから検索していく方法。大規模の検索に向いている。一般的な検索エンジンはほぼこのインデックス型にあたる。

 

ここではインデックス型の仕組みを説明する。

検索エンジンには索引構築部(Indexer)索引(Index)検索部(Searcher)の主に3部で構成されている。

索引構築部(Indexer)は検索したいテキスト文書を検索しやすい索引に変換する作業を担当するところ。具体的な仕組みとしては転置索引や接尾辞配列など。

索引(Index)は索引そのもの。OS上のファイルとして保存されるために圧縮が必要。索引の物理的な構造をつくりあげるのがこの部分。

検索部(Searcher)は圧縮された索引を復元し、要求したクエリに応じて検索結果をかえす部分。最も速度が要求される部分。

 

検索エンジンの流れとしては以下のようになる。

  1. Web上の文書・文書データベース・その他色々なファイルをクローラ(*1)で回収する。
  2. Web上の文書・文書データベース・その他色々なファイルなどは様々な構造をもつので、それらをフラットなテキスト文書に変換する。
  3. テキスト文書を索引構築部で索引に変換する。
  4. 索引としてテキスト文書がOS上のファイルとして保存・圧縮される。
  5. ユーザーが検索キーワードを入力する。
  6. 指定されたテキスト文書を復元する。
  7. ユーザーに復元したテキスト文書を提示する。

*1 クローラ…Web上の文書を収集・管理するロボット

 

参考図書

検索エンジン自作入門 ~手を動かしながら見渡す検索の舞台裏:書籍案内|技術評論社

 

オープンソースの検索エンジン

オープンソースの(全文)検索エンジンには以下のようなものがある。

Elasticsearch(https://www.elastic.co/jp/products/elasticsearch)

Javaで実装されている。検索結果の集計やGeoなど様々な機能があり、また、ログをkibanaで収集したり可視化することができる。Luceneがベース。流行中。コミュニティが活発。

Apache Solr(http://lucene.apache.org/solr/)

Javaで実装されている。ファセット検索がある。Luceneがベース。

Groonga(http://groonga.org/ja/)

C言語で実装されている。日本語サポートがあつい。関連プロジェクトとしてPGroonga,Mroonga,rroongaなどがある。コミュニティが活発。

AmazonCloudSearch(https://aws.amazon.com/jp/cloudsearch/)

Lucene+Solrがベース。34言語をサポートしている。

 

参考動画

【CROSS 2015】 全文検索エンジン群雄割拠〜あなたが使うべきはどれだ!〜 - YouTube

20160329 Groonga新リリース自慢会6.0.1に参加した

概要

20160329に行われたGroonga新リリース自慢会6.0.1の内容と感想

 

この勉強会に行ったきっかけ

  • 20160324くらいに検索を作る側にまわってみたいと思ったから
  • 20160327-20160330の間に行われるSolr,Groonga,Elasticsearch,AmazonCloudSearchの勉強会をconnpass,atnd,doorkeeperで検索したところこの勉強会がヒットしたから

 

勉強会の内容

 

知らなかったけど知ったこと

Groongaは[bitを大事にする文化がある|新しい情報に重きをおく|スループットをなるべく一定に|肉を大事にする文化がある]

実際に要望があって変更することが多い?(そういうことは少ないと思っていた)

B+は前方一致検索なら有効だがそれ以外には向かない→全文一致検索では形態素解析のように文を単語に切り分けてkeyと結果の表を作る こうすることで距離がわかるようになる(他にもメリットがある)

文章量が増えると単語ごとに出現頻度が異なる(セキュリティの暗号っぽい考え方だなと思った)

単語がレアなやつから調べることで効率的になる

インデックスの作り方にはオフラインとオンラインの2種類があること

圧縮方法にZlib,LZ4などがあり,Zlibは圧縮率が高く速度が普通,LZ4は圧縮率はそこそこで速度がはやい。んで、速度のほうがわりと重要(ここの理由を理解していない)

インデックスのオンラインにおける整合性のとり方

検索にはスクリプト構文とクエリ構文の2種類がある

 

わからなかったこと

Groongaはテーブルを型にできる

ストップワード

バックアップはカラムごとではなくページ単位でやる(これは理由がわからない)

インデックスの下にJVM

参照ロックフリー

スキップ機能

そもそもテーブルの作り方がわからない

そもそもそもそもGroongaはなんのプログラミング言語で書かれてるのか知らないまま行ってしまった

 

感想

普段は函館に住んでるのでなかなか勉強会に行けないがまた東京や札幌にいく機会があればもう一度参加したいと思った。Groonga以外の検索関連の勉強会も参加してみたい。検索をつくるのに必要な学ぶ分野を頭の中で整理できたのでよかった。まだ検索を作る側の1%も知れていないが今回の新リリース自慢会だけでも日本語検索がいかに難しいかということがわかった。

 

※この記事はGoogle Driveで公開したものと同じです。