こんにちは、馬場です。
前回に続き、全文検索エンジンのSolr と elasticsearchの比較を行いたいと思います。今回はドキュメントの登録です。
クライアントプログラムはScalaで実装します。どちらもJavaのAPI を提供しているので、それを利用しようと思います。
※ この記事では、Solr 4.6.0 とelasticsearch 0.90 の比較を行います。
Solr の場合
SolrでJava クライアント APIを利用する場合、sbt に以下のjarを登録します。
1 |
"org.apache.solr" % "solr-solrj" % "4.6.0" |
次にドキュメントを登録するサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import org.apache.solr.client.solrj.impl.HttpSolrServer import org.apache.solr.common.SolrInputDocument import java.util.Date object SolrAddDoc { def addDocument(id : String, title: String, body : String, date : Date){ val url = "http://localhost:8983/solr" val server = new HttpSolrServer(url) val doc = new SolrInputDocument() doc.addField("id", id) doc.addField("title", title) doc.addField("body", body) doc.addField("published_at", date) server.add(doc) println(server.commit()) } } |
addFieldメソッドで指定するフィールドの名前と値の型は、前回schema.xml で設定したものと同じです。
elasticsearchの場合
elasticsearch のJava のAPIを利用する場合、sbtに以下のjarを登録します。
1 |
"org.elasticsearch" % "elasticsearch" % "0.90.7" |
ドキュメントは以下のように登録します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import java.text.SimpleDateFormat import java.util.Date import org.elasticsearch.client.transport.TransportClient import org.elasticsearch.common.settings.ImmutableSettings import org.elasticsearch.common.transport.InetSocketTransportAddress object ElasticsearchAddDocSpec { def addDocument(id : String, title: String, body : String, date : Date){ val settings = ImmutableSettings.settingsBuilder() .put("client.transport.sniff", false).build() val client = new TransportClient(settings) .addTransportAddress(new InetSocketTransportAddress("localhost", 9300)) val json = new util.HashMap[String, Object]() json.put("title", title) json.put("body", body) json.put("published_at", new SimpleDateFormat("yyyy/MM/dd").format(date)) val response = client.prepareIndex("test", "docs", id.toString).setSource(json).execute.actionGet() println(response.getId) client.close() } } |
elasticsearchでは、あらかじめスキーマを定義しておく必要はありません。HashMapに設定した名前と型の通りにドキュメントを登録してくれます。
TransportAddress で指定するアドレスのポート番号は9300 で、REST APIのポート番号(9200)と異なるので、注意が必要です。
まとめ
今回はドキュメントの登録について比較しました。プログラムはMapを作って渡す形式なので、両者ほとんど差がない、と感じました。
次回(最終回)は、類似文書検索のプログラムの比較をします。