Javaでのelasticsearch利用について


#1

現在、以下のようにプログラムを組んでいます。
import static org.elasticsearch.node.NodeBuilder.*;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.StringTokenizer;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.node.Node;

/**

  • Servlet implementation class InsertServlet
    */
    @WebServlet("/InsertServlet")
    public class InsertServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**

    • @see HttpServlet#HttpServlet()
      */
      public InsertServlet() {
      super();
      // TODO Auto-generated constructor stub
      }

    /**

    • @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
      */
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      // TODO Auto-generated method stub
      try {
      //ファイルを読み込む
      FileReader fr = new FileReader("C:\work\logs\shiken.log");
      BufferedReader br = new BufferedReader(fr);

       //読み込んだファイルを1行ずつ処理する
       String line;
       StringTokenizer token;
       while ((line = br.readLine()) != null) {
       	System.out.println(line);
       	String json=line;
      
       	Node node = nodeBuilder().node();
       	Client client = node.client();
       	IndexResponse inres = client.prepareIndex("renshu", "ren")
       			.setSource(json)
       			.execute()
       			.actionGet();
      
       	node.close();
      
       }
       br.close();
      

      }catch (IOException ex) {
      //例外発生時処理
      ex.printStackTrace();
      }
      ServletContext context=getServletContext();
      RequestDispatcher rd = context.getRequestDispatcher("/Start.html");
      rd.forward(request, response);
      }
      private static boolean checkBeforeWritefile(File file){
      if (file.exists()){
      if (file.isFile() && file.canWrite()){
      return true;
      }
      }
      return false;
      }

    /**

    • @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
      */
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      // TODO Auto-generated method stub
      }

}

ファイル読み込み処理中のnodeのところでエラーが起きてしまいます
原因はなんでしょうか?
解決策を教えてください。

追加したjarのバージョンはelasticsearch-1.3.2.jar、lucene-core-5.2.1.jarです。


(Jun Ohtani) #2

エラーの内容は前回記載されていたものと変わりはないということで良いでしょうか?
コンパイル時にエラーが出るのでしょうか?
それとも実行時にエラーが出るのでしょうか?


#3

前回と変わりないです
実行時にエラーが起こります


(Jun Ohtani) #4

実行時にエラーが起こるのであれば、
ライブラリの読み込みなどに問題があるかと思います。

クラスパスに他のバージョンのjarなどが含まれていないか、確認してみるのが良いかと思います。


#5

確認したところ他のバージョンのjarはありませんでした。


(Jun Ohtani) #6

その他にはログにエラーなどは出ていないのでしょうか?
ログの前後にはどのようなメッセージが出ているのでしょうか?


#7

以下のログが出てます

Servlet.service() for servlet [InsertServlet] in context with path [/Kibana] threw exception [サーブレットの実行により例外を投げました] with root cause
java.lang.ClassNotFoundException: org.elasticsearch.node.NodeBuilder
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1701)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
at InsertServlet.doGet(InsertServlet.java:74)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)


(Jun Ohtani) #8

そもそも、作られているServletアプリからelasticsearchのjarファイルが読み込めていないようです。
(ClassNotFoundExceptionが出ているため。)

アプリの設定や配置の方法を確認したほうが良いかと。


#9

jarの構成など見直して実行したところ
下記のログが表示されました。
これはデータの格納が成功したということでいいのでしょうか?

8 24, 2015 4:53:31 午後 org.elasticsearch.node.internal.InternalNode
情報: [Diamanda Nero] version[1.6.0], pid[11416], build[cdd3ac4/2015-06-09T13:36:34Z]
8 24, 2015 4:53:31 午後 org.elasticsearch.node.internal.InternalNode
情報: [Diamanda Nero] initializing ...
8 24, 2015 4:53:31 午後 org.elasticsearch.plugins.PluginsService
情報: [Diamanda Nero] loaded [], sites []
8 24, 2015 4:53:31 午後 org.elasticsearch.env.NodeEnvironment maybeLogPathDetails
情報: [Diamanda Nero] using [1] data paths, mounts [[(C:)]], net usable_space [103gb], net total_space [224.8gb], types [NTFS]
8 24, 2015 4:53:31 午後 org.elasticsearch.node.internal.InternalNode
情報: [Diamanda Nero] initialized
8 24, 2015 4:53:31 午後 org.elasticsearch.node.internal.InternalNode start
情報: [Diamanda Nero] starting ...
8 24, 2015 4:53:31 午後 org.elasticsearch.transport.TransportService doStart
情報: [Diamanda Nero] bound_address {inet[/0:0:0:0:0:0:0:0:9301]}, publish_address {inet[/10.25.107.40:9301]}
8 24, 2015 4:53:31 午後 org.elasticsearch.discovery.DiscoveryService doStart
情報: [Diamanda Nero] elasticsearch/jFFi3dE4ThuZTiCCs7HFEQ
8 24, 2015 4:53:34 午後 org.elasticsearch.cluster.service.InternalClusterService$UpdateTask run
情報: [Diamanda Nero] detected_master [Morgan Le Fay][ylESzb88QGW8fa0ZeKHoIw][A003664589][inet[/:9300]], added {[Morgan Le Fay][ylESzb88QGW8fa0ZeKHoIw][A003664589][inet[/:9300]],}, reason: zen-disco-receive(from master [[Morgan Le Fay][ylESzb88QGW8fa0ZeKHoIw][A003664589][inet[/:9300]]])
8 24, 2015 4:53:34 午後 org.elasticsearch.http.HttpServer doStart
情報: [Diamanda Nero] bound_address {inet[/0:0:0:0:0:0:0:0:9201]}, publish_address {inet[/:9201]}
8 24, 2015 4:53:34 午後 org.elasticsearch.node.internal.InternalNode start
情報: [Diamanda Nero] started
8 24, 2015 4:53:34 午後 org.elasticsearch.node.internal.InternalNode stop
情報: [Diamanda Nero] stopping ...
8 24, 2015 4:53:34 午後 org.elasticsearch.node.internal.InternalNode stop
情報: [Diamanda Nero] stopped
8 24, 2015 4:53:34 午後 org.elasticsearch.node.internal.InternalNode close
情報: [Diamanda Nero] closing ...
8 24, 2015 4:53:34 午後 org.elasticsearch.node.internal.InternalNode close
情報: [Diamanda Nero] closed


(system) #10