誰もが知っているように、ElasticsearchはLuceneに基づく検索サーバーに基づいたESと呼ばれます。 Restful Webインターフェイスに基づいて、分散マルチユーザー機能フルテキスト検索エンジンを提供します。 ElasticsearchはJavaで開発され、Apacheライセンスの条件の下でオープンソースとしてリリースされます。現在、人気のあるエンタープライズレベルの検索エンジンです。クラウドコンピューティングで設計されているため、リアルタイムの検索、安定性、信頼性、高速、インストールと使用が簡単になります。
Webサイトまたはアプリケーションを構築し、検索機能を追加しますが、検索ジョブを作成することは非常に困難です。検索ソリューションを高速に実行し、ゼロ構成と完全に無料の検索モードを持ちたい、JSONを使用してHTTPを介してデータをインデックスすることを望んでいます。検索サーバーを常に利用できるようにしたい、スケーリングを数百にしたい、リアルタイムで検索したい、シンプルなマルチテナントになりたい、クラウドソリューションを構築したい。したがって、ElasticSearchを使用して、これらすべての問題や発生する可能性のある他の問題を解決します。
JavaでESを使用する場合、クエリ速度が十分に速くなく、効率が十分に高くないという問題を解決したいだけです。データベースからのデータの単一のクエリは、現在のビジネスニーズを満たすことができなくなりました。わかりました!それでは、JavaのESの魔法の検索サーバーの使用方法について説明しましょう。まず、ES依存関係パッケージを参照する必要があり、依存関係は次のとおりです。
<Dependency> GroupId> org.Elasticsearch.Client </groupId> <artifactid> Transport </artifactid> <version> 5.5.0 </version> </dependency> <groupid> erg.elasticsearch.client </groupid> <artifactid> Transport </artifactid> <バージョン> 5.0 </dependency> <Dependency> groupId> org.Elasticsearch </groupId> <Artifactid> elasticsearch </artifactid> <version> 5.5.0 </version> </depentency>
依存関係を追加した後、ES使用段階を入力します。ちなみに、説明する必要がある問題があります。 ESを使用するには、JDK1.8ツールキットとTomcatをバージョン7.05以上にインストールする必要があります。そうしないと、ESはサポートされず、プロジェクトに統合する際にエラーが報告される場合があります。 、ESのインストールとダウンロードもあります。ここにダウンロードアドレスがあります:https://www.elastic.co/downloads/elasticsearch
すべての準備ができたら、私たちは本当に楽しみにしている瞬間に入ります。はい、JavaのESサーバーのものを検索してクエリする方法、あなたのためにそれらを1つずつ明らかにさせてください。
まず、ESツールのクラスをお勧めします
パッケージcom.osa.utils; import java.io.bufferedreader; import java.io.ioexception; Import java.io.inputStreamReader; Import java.io.io.printwriter; Import java.net.url; Import java.net.urlconnection; Import java.net.net.net.net.urlencoder; java.util.list; import java.util.map; import java.util.set; import org.apache.http.client.clientProtocolexception; Import com.alibaba.fastjson.jsonarray; Import com.alibaba.fastjson.jsonection; {/** *指定されたurl * * @param url * urlにリクエストを送信してリクエストを送信します * @param param *リクエストパラメーター、リクエストパラメーターはname1 = value1&name2 = value2の形式でなければなりません。 * @return url response rexime resime resumped remite resourceで表されるリモートリソースの結果bufferedreader in = null; try {string urlnamestring = url + "?" + param; url realurl = new url(urlnamestring); // url urlconnection connection = realur.openconnection()間の接続を開きます。 //一般リクエスト属性connection.setRequestProperty( "Accept"、 "*/*"); connection.setRequestProperty( "Connection"、 "Keep-Alive"); connection.setRequestProperty( "user-agent"、 "mozilla/4.0(互換; msie 6.0; windows nt 5.1; sv1)"); //実際の接続connection.connect(); //すべての応答ヘッダーフィールドマップ<文字列、リスト<文字列>> map = connection.getheaderfields(); //すべての応答ヘッダーフィールド(文字列キー:map.keyset()){system.out.println(key + "--->" + map.get(key)); } // bufferedreader入力ストリームを定義して、urlの応答を読み取ります= new BufferedReader(new inputstreamReader(connection.getInputStream()));文字列線; while((line = in.readline())!= null){result += line; }} catch(Exception e){system.out.println( "get要求を送信するときに例外が発生しました!" + e); e.printstacktrace(); } //最終的にブロックを使用して入力ストリームを閉じます{if(in!= null){in.close(); }} catch(例外E2){e2.printstacktrace(); }} return result; } /** *指定されたurl * @param url * urlにリクエストを送信してリクエストを送信します * @param param *リクエストパラメーター、要求パラメーターはname1 = value1&name2 = value2の形式である必要があります。 * @return応答 */ public static string sendpost(string url、string param)で表されるリモートリソースの結果{printwriter out = null; bufferedreader in = null;文字列結果= ""; try {url realurl = new URL(url); // urlconnection conn = realur.openconnection()の間の接続を開きます。 //一般リクエスト属性conn.setRequestProperty( "Accept"、 "*/*"); conn.setRequestProperty( "Connection"、 "Keep-Alive"); conn.setRequestProperty( "user-agent"、 "mozilla/4.0(互換; msie 6.0; windows nt 5.1; sv1)"); // POSTリクエストを送信するには、次の2行をconn.setDoOutput(true)に設定する必要があります。 conn.setDoinput(true); // urlConnectionオブジェクトに対応する出力ストリームを取得= new PrintWriter(conn.getOutputStream()); //リクエストパラメーターを送信してください。print(param); //フラッシュ出力ストリームのbuffer out.flush()。 // bufferedreader入力ストリームを定義して、url in = new BufferedReader(new inputStreamReader(conn.getInputStream()))の応答を読み取ります。文字列線; while((line = in.readline())!= null){result += line; }} catch(Exception e){System.out.println( "POSTリクエストを送信するときに例外が発生しました!" +e); e.printstacktrace(); } //最終的にブロックを使用して出力ストリームを閉じ、入力ストリームは最終的に{if(out!= null){out.close(); } if(in!= null){in.close(); }} catch(ioException ex){ex.printstacktrace(); }} return result; }}ツールクラスが利用可能になった後、リクエストを送信するための2つの方法があることがわかります。1つはsendgetとsendpostメソッドです。 2つの方法は、独自の選択に基づいて選択できます。もちろん、これは要求を送信するための単なる方法です。それらを呼ぶ方法は?ここでは、ESからクエリをしているため、MyBatisまたはHibernateフレームワークを使用する必要はありません。次のように、SQLをデータレイヤーで自分で定義し、以前のツールクラスを介してSendGet/SendPostメソッドを呼び出すことができます。
string sql = urlencoder.encode( "select * from table");エンコードメソッドは主にsqlのいくつかのスペースを削除します
string result = httpsentutils.sendget( "http://221.124.71.8:9200/_sql"、 "sql ="+sql); IP Plusポートは、インストール時に構成できます
わかりました!一般に、現時点で送信が成功した場合、ESのデータを取得できます。 ESで返されたJSONデータであるため、JSON文字列をフォーマットします。
net.sf.json.jsonobject jsonobject = net.sf.json.jsonobject.fromobject(result); //ヒットタグnet.sf.json.jsonobject hitsjsonobject = jsonobject.getjsonobject( "hits");
データが取得された後、それが事業運営であると結論付けられます。ほぼここにあります。
上記はクエリの操作であるため、データをESに挿入する必要がある場合はどうすればよいですか?例を挙げてください
パッケージcom.sojson.core.elasticsearch.manager; import java.util.arraylist; import java.util.hashmap; import java.util.list; import java.util.map; Import net.sf.json.jsonobject; Import org.elasticsearch.action.bulk.bulkrequestbuilder; elasticsearch.chbulk.bulkresponse; Import org.elasticsearch.action.index.indexrequestbuilder; Import com.sojson.common.utils.stringutils; Import com.sojson.sojson.core.elasticsearch.utils.estools; publicclassertmanager {/*** dataged add datage indexmanager type*@param idname id field name*@param json保存されたjsonはmap*@return*/publicstaticmapsave(string index、string type、string idname、jsonobject json)を受け入れることができます。渡されたパラメーターは処理され、挿入操作を実行するために保存方法と呼ばれます
/*** elasticsearchにデータを追加*@param index*@param idname IDフィールド名*@param listdata@param listdata a objects*@return*/@suppresswarningss( "unchecked")publicsstaticmapsave(文字列インデックス、文字列タイプ、文字列idname、listdata) = estools.client.preparebulk()。setrefresh(true); map resultmap = newhashmap(); for(object:listdata){jsonobject json = jsonobject.fromobject(object); // no idnameは指定されてから、elasticsearchを自動的に生成します。 if(stringutils.isblank(idname)){indexrequestbuilder lrb = elasticsearchutils.client .prepareindex(index、type).setsource(json); bulkrequest.add(lrb); // elasticsearchutilsはツールクラスです。 json.optstring(idname); indexRequestBuilder lrb = estools.client.prepareIndex(index、type、idvalue).setsource(json); bulkrequest.add(lrb);}} bulk response bulkresponse = bulkRequest.execute()。actionget(); if(bulkresponse.hasfailures()){//各バルク応答itemsystem.out.println(bulkresponse.getItems()。toString()); toString(); resultmap.put( "500"、 "500"、 "save ees failed!"); resultMap;} bulkRequest = estools.client.preparebulk(); resultmap.put( "200"、 "save es succune!"); return resultmap;}}} ElasticSearchutilsツールクラス
Public Class ElasticSearchutils {private static final string cluster_name = "cluster.name"; private static final string es_ip = "es.ip"; private static final string es_port = "es.port"; private static clientclient client; public static transportclient getesclient( settings.builder()。put(cluster_name、configutils.getConfig(cluster_name)) integer.parseint(configutils.getconfig(es_port)));} return client;}上記は挿入操作です。さて、それは今日の要約のためです。私はそれがあなたにいくつかの小さな助けをもたらすことができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。