FC2ブログ

スポンサーサイト

-------- --:--:-- --

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Solr】Solrjでデータを登録

2011-10-08 11:51:17 Sat

概要


Solrjを利用するプログラムが置かれたサーバとは別のサーバから
Solrに登録するデータを取得し、Solrjを利用してSolrに登録します。
なお、Solrjを利用するプログラムはSolrサーバと同じマシン内になくても
ネットワークで疎通できるのであればバラバラでも大丈夫です。

こんなイメージ。

  • Solrサーバ           192.168.0.50

  • Solrjバッチサーバ    192.168.0.51

  • Solr連携データサーバ 192.168.0.52



ライブラリなどは前回の記事と同様です。


方法


上記の例のSolr連携データサーバからHTTPインタフェースで連携データをレスポンスする
インタフェースを用意し、データを取得します。
これをSolrjを利用してSolrサーバに登録します。
ソースは下記のようになります。


import java.math.BigDecimal;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import net.arnx.jsonic.JSON;

import org.apache.http.ConnectionReuseStrategy;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.impl.DefaultConnectionReuseStrategy;
import org.apache.http.impl.DefaultHttpClientConnection;
import org.apache.http.message.BasicHttpRequest;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.params.SyncBasicHttpParams;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpProcessor;
import org.apache.http.protocol.HttpRequestExecutor;
import org.apache.http.protocol.ImmutableHttpProcessor;
import org.apache.http.protocol.RequestConnControl;
import org.apache.http.protocol.RequestContent;
import org.apache.http.protocol.RequestExpectContinue;
import org.apache.http.protocol.RequestTargetHost;
import org.apache.http.protocol.RequestUserAgent;
import org.apache.http.util.EntityUtils;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.common.SolrInputDocument;

/**
* Elemental example for executing a GET request.
*


* Please note the purpose of this application is demonstrate the usage of HttpCore APIs.
* It is NOT intended to demonstrate the most efficient way of building an HTTP client.
*
*
*
*/
public class SolrDequeuMain {

public static void main(String[] args) throws Exception {

HttpParams params = new SyncBasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
HttpProtocolParams.setUseExpectContinue(params, true);

HttpProcessor httpproc = new ImmutableHttpProcessor(new HttpRequestInterceptor[] {
// Required protocol interceptors
new RequestContent(),
new RequestTargetHost(),
// Recommended protocol interceptors
new RequestConnControl(),
new RequestUserAgent(),
new RequestExpectContinue()});

HttpRequestExecutor httpexecutor = new HttpRequestExecutor();

HttpContext context = new BasicHttpContext(null);
HttpHost host = new HttpHost("192.168.0.52", 8888);

DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy();

context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host);

try {

String[] targets = {
// "/",
// "/servlets-examples/servlet/RequestInfoExample",
"/json/solr/get_queue"};

for (int i = 0; i < targets.length; i++) {
if (!conn.isOpen()) {
Socket socket = new Socket(host.getHostName(), host.getPort());
conn.bind(socket, params);
}
BasicHttpRequest request = new BasicHttpRequest("GET", targets[i]);
System.out.println(">> Request URI: " + request.getRequestLine().getUri());

request.setParams(params);
httpexecutor.preProcess(request, httpproc, context);
HttpResponse response = httpexecutor.execute(request, conn, context);
response.setParams(params);
httpexecutor.postProcess(response, httpproc, context);
System.out.println("<< Response: " + response.getStatusLine());
String json = EntityUtils.toString(response.getEntity());
System.out.println(json);
HashMap jsonmap = JSON.decode(json);
String status = (String)jsonmap.get("status");
List> list = (ArrayList>)jsonmap.get("queue");
if(list == null){
list = new ArrayList>();
}

SolrServer server = new CommonsHttpSolrServer("http://192.168.0.50:8983/solr");
List docs = new ArrayList();

for(HashMap entityMap : list){
HashMap blog = (HashMap)entityMap.get("blog");
String blogValue = (String)blog.get("value");
System.out.println(blogValue);
HashMap key = (HashMap)entityMap.get("key");
BigDecimal id = (BigDecimal)key.get("id");
System.out.println(id);

SolrInputDocument document = new SolrInputDocument();
document.addField("blog", blogValue);
document.addField("id", id.toString());
docs.add(document);

}

if(docs != null && docs.size() > 0){
server.add(docs);
server.commit();
System.out.println("solr commit success.");
}

// System.out.println(obj);
System.out.println("==============");
if (!connStrategy.keepAlive(response, context)) {
conn.close();
} else {
System.out.println("Connection kept alive...");
}
}
} finally {
conn.close();
}
}

}


httpclientはcommons httpclientの後継のようですが、
日本語記事ではあんまり参考ソースないようです。
サンプルコードは下記のBasic HTTP GETです。
http://hc.apache.org/httpcomponents-core-ga/examples.html

JSON形式で返ってくるデータがqueueプロパティに配列があり、
この配列内のオブジェクトにblogプロパティとkeyプロパティがあります。
blogは全文検索対象の値、keyはid項目と対になるものです。
なので、これらをSolrサーバに登録します。


for(HashMap entityMap : list){
HashMap blog = (HashMap)entityMap.get("blog");
String blogValue = (String)blog.get("value");
System.out.println(blogValue);
HashMap key = (HashMap)entityMap.get("key");
BigDecimal id = (BigDecimal)key.get("id");
System.out.println(id);

SolrInputDocument document = new SolrInputDocument();
document.addField("blog", blogValue);
document.addField("id", id.toString());
docs.add(document);

}

if(docs != null && docs.size() > 0){
server.add(docs);
server.commit();
System.out.println("solr commit success.");
}



SolrjもHTTP通信部分をラップしてくれているのでコーディングは簡単だと思います。
スポンサーサイト

⇒comment

Secret

名言集
全記事(数)表示
全タイトルを表示
ブログ内検索
Loading
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。