elasticsearchでスコア検索(DECAY FUNCTION)導入手順のメモ書き

elasticsearch_symbol

どうも、こんにちは。
最近、ブログをサボっておりました。
前回の記事「elasticsearchのスコア検索が使えそうだわ」の記事で書いたスコア検索を試すまでのメモ書きです。

elasticsearchのインストール

elasticsearchのインストールに関しては、こちらのブログ記事「Elasticsearch クイックスタート」を参考にさせていただきました。
まずは、elasticsearchの「インストール」->「マッピング」->「インデックス」->「サーチ」の要領を掴むまでがんばる。(割愛)

Japanese (kuromoji) Analysis Plugin をインストール

日本語の検索が出来るように、kuromoji のインストールを行います。
インデックス時にkuromojiを指定しても良いのですが、面倒くさいのデフォルトでkuromoji を利用するようにしてみました。

$ vi /etc/elasticsearch/elasticsearch.yml
index.analysis.analyzer.default.type: custom
index.analysis.analyzer.default.tokenizer: kuromoji_tokenizer

elasticsearch-php

※ローデータの扱いが得意じゃないので「elasticsearch-php」を利用してみました。

データを作成して検索まで

インデックス作成

$client = new Elasticsearch\Client();
$indexParams['index']  = 'index_name';
$client->indices()->create($indexParams);

マッピング

DECAY FUNCTION を利用する場合は、データの形式を「位置情報(geo_point)」、「日付(date)」「数字(integer)」でインデックスされている必要があるので、マッピングをしておく。

$client = new Elasticsearch\Client();
$params['index'] = 'index_name';
$params['type']  = 'type_name';
$mapp = array(
'properties' => array(
'location' => array( // 位置情報格納用
'type' => 'geo_point'
),
'date' => array( // 時間
'type' => 'date',
'format' => 'YYYY-mm-dd'
),
'cost' => array( // コスト
'type' => 'integer'
)
)
);
$params['body']['type_name'] = $mapp;
$client->indices()->putMapping($params);

インデックス

$client = new Elasticsearch\Client();
$params['index'] = 'index_name';
$params['type']  = 'type_name';
//データベースのデータをインデックスしていく
foreach ($data as $value) {
obj['location'] = $value['lat'] ." , ". $value['lon'] ;
obj['date'] = $value['date'];
obj['cost'] = $value['cost'];
$params['body'] = $obj;
$client->index($params);
}

サーチ

$client = new Elasticsearch\Client();
$params['index'] = 'index_name';
$params['type'] = 'type_name';
/////DECAY
$location_params['gauss']['location']['origin'] = $input['ido'] . " , " . $input['keido'];
$location_params['gauss']['location']['scale'] = "30km";
$location_params['gauss']['location']['offset'] = "0km";
$location_params['gauss']['location']['decay'] = "0.50";
$params['body']['query']['function_score']['functions'][] = $location_params;
$date_params['gauss']['date']['origin'] = date("Y-m-d",strtotime("+2 day"));
$date_params['gauss']['date']['scale'] = "180d";
$date_params['gauss']['date']['offset'] = "0d";
$date_params['gauss']['date']['decay'] = "0.70";
$params['body']['query']['function_score']['functions'][] = $date_params;
$price_params['gauss']['cost']['origin'] = 5000;
$price_params['gauss']['cost']['scale'] = 15000;
$price_params['gauss']['cost']['offset'] = 0;
$price_params['gauss']['cost']['decay'] = "0.90";
$params['body']['query']['cost']['functions'][] = $price_params;
//boost_mode(クエリとfunctionの掛けあわせ方法)
// replace sum avg max min multiply
$params['body']['query']['function_score']['boost_mode'] = "avg";
//score_mode(filterの制御方法)
// min max total avg multiply
$params['body']['query']['function_score']['score_mode'] = "avg";
//件数
$params['body']['size'] = 20;
//SEARCH
$results = $client->search($params);
//VIEWへセット(phalconフレームワークを利用)
$this->view->setVar("lists", $results['hits']['hits']);

こんな感じの流れでイケると思います。
以上、メモ書きでした。
※詳しくはelasticsearchのfunction score queryのページを見てね。
それでは。

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る