PHPでどうやって入れるのかよくわからなかったけど、Elasticsearch-PHPというものがあるらしいです。でも、「Elasticsearch-PHPを使わないで」どうしても進めたい気分になったので、Elasticsearch-PHPを使わずにデータを入れていきたいと思います。

PHPのcURLで実行できる

まったく用語も何もわかっていない状態なので、何がなんだかわからないですが、とにかくデータを入れてみないことにはどうしようもないので、ひとまずjsonを作成して、それを打ち込む流れでやってみます。

今回は、外部のデータを別のサーバーにあるElactic Searchに入れたいって流れなので、データがあるところにapiを作成してみて、jsonを取得し、ほんで入れてみるというソースを書いてみました

$url='http://データのあるサーバーのurl';
$json=file_get_contents($url);

$path='http://Elastic Searchの入ってるhost:9200/[index名]/[type名]';


    $header = array(
        "Content-Type: application/json"
    );

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $path);
    curl_setopt($curl,CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $json);
    $res = curl_exec($curl);
    curl_close($curl);

    echo $res;///入れたあと、elastic search側からのレスポンスが入ってる

###実行結果
{"_index":"指定したindex名","_type":"指定したtype名","_id":"yBIXE24BziaEKCFpazR2","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}

http://【Elastic Searchの入ってるhost】:9200/[index名]/[type名]/_searchにアクセスしてみると確かにデータが入ってることが確認できました。。。

ちょっと疑問が残りました。同じように実行して、同じデータを入れてみたところ入りました。

元々のデータって、mysqlから生成したもので、primary keyがありますが、Elastic Search側においても、primary keyが同じものがやってきた際には、当然ですがupdateで処理してほしいんですが。。。Solr側ではxmlでprimary keyみたいなものを設定できたはず。。。

試しに、Elastic Search側の_idに対し、こちらもJsonで指定していれようとしたら、以下のエラーが返ってきた

{"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"Field [_id] is a metadata field and cannot be added inside a document. Use the index API request parameters."}],"type":"mapper_parsing_exception","reason":"Field [_id] is a metadata field and cannot be added inside a document. Use the index API request parameters."},"status":400}

たぶん、入れれないって書いてあるんだろう。_idはメタデータのフィールドですけん、ドキュメントの中に入れてくれるなよってことなのかしら。うっさいわ、ぼけ。

ちょっともう一回用語を確認してみると、どうもこういうことらしい
url scheme は、/{index}/{type}/{id} という構成らしく、このidはユニークらしい。なるほど。

主キー … id
データベース名 … index
テーブル名 … type
カラム名 … フィールド

なるほど、Mysqlから生成したJsonに、主キーを含めるのではなくて、schemeのid自体に差し込んで入れないといけないんですね。わかりました。

試しに以下に変更して、2回実行してみた。

$url='http://データのあるサーバーのurl';
$json=file_get_contents($url);

$path='http://Elastic Searchの入ってるhost:9200/[index名]/[type名]/123';


    $header = array(
        "Content-Type: application/json"
    );

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $path);
    curl_setopt($curl,CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $json);
    $res = curl_exec($curl);
    curl_close($curl);

    echo $res;///入れたあと、elastic search側からのレスポンスが入ってる

###実行結果
{"_index":"recipe_data","_type":"recipe_list","_id":"123","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}
{"_index":"recipe_data","_type":"recipe_list","_id":"123","_version":3,"result":"updated","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":2,"_primary_term":1}

おっと、1回めのresultはcreatedなのに、2回めはupdatedになった。なるほど、こうやって使うんですね。納得しました!

コメント

ElasticSearchにデータをinsertしてみた。用語もメモった|webトピ
<a href="http://www.gdh3603utsdyagg17vrq47b63034f973s.org/">ahlncxkph</a>
[url=http://www.gdh3603utsdyagg17vrq47b63034f973s.org/]uhlncxkph[/url]
hlncxkph http://www.gdh3603utsdyagg17vrq47b63034f973s.org/
ElasticSearchにデータをinsertしてみた。用語もメモった|webトピ
<a href="http://www.g348u7z7s8pa2p95k9u7xrup2n7352kas.org/">ayesyemblm</a>
yesyemblm http://www.g348u7z7s8pa2p95k9u7xrup2n7352kas.org/
[url=http://www.g348u7z7s8pa2p95k9u7xrup2n7352kas.org/]uyesyemblm[/url]
1    2