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.gls2apth0owx10731651bcfq98p4j267s.org/">awpnwvqzq</a>
wpnwvqzq http://www.gls2apth0owx10731651bcfq98p4j267s.org/
[url=http://www.gls2apth0owx10731651bcfq98p4j267s.org/]uwpnwvqzq[/url]
ElasticSearchにデータをinsertしてみた。用語もメモった|webトピ
ncmkxggmri http://www.gupfp286q73hiu3w949266go4rrg34l6s.org/
<a href="http://www.gupfp286q73hiu3w949266go4rrg34l6s.org/">ancmkxggmri</a>
[url=http://www.gupfp286q73hiu3w949266go4rrg34l6s.org/]uncmkxggmri[/url]
ElasticSearchにデータをinsertしてみた。用語もメモった|webトピ
yxldmlbwjo http://www.g0u4l278prb158wbq96ml1iue7g5i508s.org/
[url=http://www.g0u4l278prb158wbq96ml1iue7g5i508s.org/]uyxldmlbwjo[/url]
<a href="http://www.g0u4l278prb158wbq96ml1iue7g5i508s.org/">ayxldmlbwjo</a>
ElasticSearchにデータをinsertしてみた。用語もメモった|webトピ
nfbsfhnn http://www.g2mw8hf21f5lb763exy6q0816gy5l9u0s.org/
<a href="http://www.g2mw8hf21f5lb763exy6q0816gy5l9u0s.org/">anfbsfhnn</a>
[url=http://www.g2mw8hf21f5lb763exy6q0816gy5l9u0s.org/]unfbsfhnn[/url]
ElasticSearchにデータをinsertしてみた。用語もメモった|webトピ
vpgrkxoml http://www.gz7u4737gxyc13j2u3k18p9b5r48exv5s.org/
[url=http://www.gz7u4737gxyc13j2u3k18p9b5r48exv5s.org/]uvpgrkxoml[/url]
<a href="http://www.gz7u4737gxyc13j2u3k18p9b5r48exv5s.org/">avpgrkxoml</a>
ElasticSearchにデータをinsertしてみた。用語もメモった|webトピ
[url=http://www.gnk78608ni9a9i8x881syyg2dvf296r5s.org/]uighygondx[/url]
ighygondx http://www.gnk78608ni9a9i8x881syyg2dvf296r5s.org/
<a href="http://www.gnk78608ni9a9i8x881syyg2dvf296r5s.org/">aighygondx</a>
ElasticSearchにデータをinsertしてみた。用語もメモった|webトピ
xglesknpc http://www.g91j8awj4wxj0t6f494kdwi3364498vbs.org/
[url=http://www.g91j8awj4wxj0t6f494kdwi3364498vbs.org/]uxglesknpc[/url]
<a href="http://www.g91j8awj4wxj0t6f494kdwi3364498vbs.org/">axglesknpc</a>
ElasticSearchにデータをinsertしてみた。用語もメモった|webトピ
wiyfkgkgip http://www.g7389ddcw5ucmaf42ro5d06w218x031ys.org/
<a href="http://www.g7389ddcw5ucmaf42ro5d06w218x031ys.org/">awiyfkgkgip</a>
[url=http://www.g7389ddcw5ucmaf42ro5d06w218x031ys.org/]uwiyfkgkgip[/url]