読者です 読者をやめる 読者になる 読者になる

【aws】ElasticSearchでMore Like This検索をを使ってみたのでメモ

はじめに

今回やりたかったのは、dbに文章が登録されていて
あるレコードと類似した内容のデータを取得するということ

で、awsのelastic searchというサービスがまさにやりたいことがあったので試してみた。
awsコンソールでの作業はわかりずらい箇所はなかったので省略

indexとtypeの作成(dbのテーブル作成と同じ)

$url = "search-xxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com";
$index_name = "test-index";
$type_name = "test";

// index作成
$cmd = "curl -XPUT {$url}/{$index_name}"
exec($cmd);

// type作成
$json = json_encode(array(
    $type_name => array(
        "properties" => array(
            "id" => array("type" => "integer"),
            "content"   => array("type" => "string", "term_vectors" => "yes"), // ★この項目で類似検索する(term_vectorsをつけること)
        ),
    ),
));
$cmd = "curl -XPUT {$url}/{$index_name}/{$type_name}/_mapping -d '{$json}'"; 
exec($cmd);

テストデータ登録

以下はid = 123のレコードを1件登録

$id = "123";
$json = json_encode(array(
    "id" => $id,
    "content"   => "テストです",
));                                                                    
$cmd = "curl -XPUT {$url}/{$index_name}/{$type_name}/{$id} -d '{$json}'";  
exec($cmd);

検索

$json = json_encode(array(
    "query" => array(
        "match" => array("content" => "検索キーワード"),
    ),
));
$cmd = "curl -XGET {$url}/{$index_name}/{$type_name}/_search -d '{$json}'";
$result = exec($cmd, $result);

More Like This検索

id = 1、2、3と類似するデータを取得するときは以下

$json = json_encode(array(               
    "from" => 0,  // 0〜100件取得
    "size" => 100,
    "query" => array(
        "more_like_this" => array(
            "fields" => array("content"),
            "ids" => array("1","2","3"),
        ),
    ),
));
$cmd = "curl -XGET {$url}/{$index_name}/{$type_name}/_search -d '{$json}'";
$result = exec($cmd);

sdkも使わず、とりあえず動きを確認できるということでこんな感じでした
以上です