2012 11 29 groonga 勉強会 発表資料

Preview:

DESCRIPTION

groonga勉強会「全文検索エンジンgroongaを囲む夕べ3」で、発表しました。

Citation preview

「外資就活ドットコム」のサイト内検索を

作るときに考えたこと

Yoshiyuki OnishiDirector / CTO Howtelevision, Inc.

外資就活ドットコムとは

外資就活ドットコムでは、グローバルプロフェッショナルを目指す上位校学生にとって必要なトップ企業の選考情報・イベント情報・業界研究に役立つコラムをタイムリーに提供しております

・月間1,100,000 PV150,000 UU

どういったコンテンツがあるのか

コラム記事がはてなブックマークのホッテントリに

groonga 導入以前

当初 WordPress のブログとして運営開始、WordPress の検索機能

サイトの成長に伴い、コンテンツの種類が増加

コンテンツの種類

● コラム● 選考情報

各企業の採用情報 企業研究

特集

検索対象コンテンツを整理する

● 検索条件○ priority○ date○ マッチング対象

● 検索結果表示○ url path○ タイトル○ スニペット○ DB のテーブル, 抽出条件

検索対象となるコンテンツの分類

検索項目

ページ種別 priority マッチング対象 テーブル 抽出条件

コラム特集 1 タイトル本文

posts post_type = 'special' AND post_name LIKE 'column_%'

採用情報ページ(企業広告)

2 企業名, 概要 com_page status = 'publish' AND id > 1

企業研究 3 企業名 company_study

コラム 4 タイトル本文

posts post_type = 'post' AND post_status = 'publish'

募集情報 4 タイトル本文

recruiting_info status = 'publish'

検索対象となるコンテンツの分類

結果の表示に用いる項目

種別 url path type タイトル スニペット

コラム特集 /cpecail/column_{id} special <タイトル> post_content からショートタグを除いたもの

採用情報ページ(企業広告)

/company/{id} company_page <企業名>の採用情報 会社概要

企業研究 /company_study/{id} company_study <企業名>の企業研究 のインターン・新卒採用の募集情報、選考対策、口コミ、給料、採用ページを集めた関連リンク集などを掲載。

コラム /archives/{id} column <記事タイトル> 本文からキーワード周辺を抜粋

募集情報 /recruiting_info/view/{id} recruiting_info <記事タイトル> 本文からキーワード周辺を抜粋

groonga インデックスのスキーマ定義

table_create --name Item --flags TABLE_HASH_KEY --key_type ShortTextcolumn_create --table Item --name title --flags COLUMN_SCALAR --type ShortTextcolumn_create --table Item --name content --flags COLUMN_SCALAR --type Textcolumn_create --table Item --name post_date --flags COLUMN_SCALAR --type Timecolumn_create --table Item --name priority --flags COLUMN_SCALAR --type Int32column_create --table Item --name type --flags COLUMN_SCALAR --type ShortText

table_create --name Bigram --flags TABLE_PAT_KEY|KEY_NORMALIZE --key_type ShortText --default_tokenizer TokenBigramcolumn_create --table Bigram --name title_index --flags COLUMN_INDEX|WITH_POSITION|WITH_SECTION --type Item --source title,content

● N-gram● 複数のカラム(タイトル、本文)に対して1つのインデックスを付与

検索クエリ

$qs = http_build_query( array( 'table' => 'Item', 'match_columns' => 'title||content', 'query' => $args['q'], 'output_columns' => '_key,type,title,content,_score,post_date', 'sortby' => 'priority,-post_date,_score', 'limit' => $per_page, 'offset' => $offset ) );

$url = "http://xxx.xxxxxx.xxx:port/d/select?$qs";

記事の更新/削除とインデックス反映

WebApp(cakephp)

WordPress

Job Queue(TheSchwartz)

groongahttpd groonga

DB

DB(MySQL)

add queue

query over HTTP

post ID

検索結果の例:企業名

 

検索結果の例:業界名

 

アプリケーション側で実装

● ページング

● スニペット, 検索ワードのハイライト

● 種別をラベルとして表示○ 募集情報 / コラム / 企業研究 / 特集 / 採用情報

ご清聴ありがとうございました

まとめ

● 検索対象を整理する

● 検索結果の表示○ 何を表示するか○ 並び順

● 検索クエリ