Solr vs elasticsearch 類似文書検索(ドキュメントの登録)


こんにちは、馬場です。
前回に続き、全文検索エンジンのSolr と elasticsearchの比較を行いたいと思います。今回はドキュメントの登録です。

クライアントプログラムはScalaで実装します。どちらもJavaのAPI を提供しているので、それを利用しようと思います。

※ この記事では、Solr 4.6.0 とelasticsearch 0.90 の比較を行います。

Solr の場合

SolrでJava クライアント APIを利用する場合、sbt に以下のjarを登録します。

  "org.apache.solr" % "solr-solrj" % "4.6.0"

次にドキュメントを登録するサンプルコードです。

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を登録します。

  "org.elasticsearch" % "elasticsearch" % "0.90.7"

ドキュメントは以下のように登録します。

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を作って渡す形式なので、両者ほとんど差がない、と感じました。

次回(最終回)は、類似文書検索のプログラムの比較をします。


This entry was posted in その他. Bookmark the permalink.