우리 모두가 알고 있듯이 Elasticsearch는 Lucene을 기반으로 한 검색 서버를 기반으로하는 ES라고합니다. 나머지 웹 인터페이스를 기반으로 분산 된 다중 사용자 기능 전체 텍스트 검색 엔진을 제공합니다. Elasticsearch는 Java로 개발되었으며 Apache 라이센스의 조건에 따라 오픈 소스로 출시됩니다. 현재 인기있는 엔터프라이즈 레벨 검색 엔진입니다. 클라우드 컴퓨팅으로 설계된이 제품은 실시간 검색, 안정성, 신뢰성, 빠르고 설치 및 사용이 쉽습니다.
웹 사이트 나 응용 프로그램을 구축하고 검색 기능을 추가하지만 검색 작업을 만드는 것은 매우 어렵습니다. 우리는 검색 솔루션이 빠르게 실행되기를 원하고 구성 제로 구성과 완전 무료 검색 모드를 원합니다. JSON을 사용하여 간단히 HTTP를 통해 데이터를 색인화 할 수 있고, 검색 서버가 항상 사용할 수 있기를 원합니다. 우리는 하나에서 수백까지 시작하고 실시간으로 검색하고 싶고, 간단한 멀티 테넌트가되고 싶고, 클라우드 솔루션을 구축하고 싶습니다. 따라서 우리는 Elasticsearch를 사용하여 이러한 모든 문제와 발생할 수있는 다른 문제를 해결합니다.
Java에서 ES를 사용할 때는 쿼리 속도가 충분하지 않고 효율이 충분하지 않다는 문제를 해결하고 싶습니다. 데이터베이스의 단일 데이터 쿼리는 더 이상 현재 비즈니스 요구를 충족시킬 수 없습니다. 좋아요! 이제 Java에서 ES의 마법 검색 서버를 사용하는 방법에 대해 이야기 해 봅시다. 우선 ES 의존성 패키지를 참조해야하며 종속성은 다음과 같습니다.
<pectionency> <groupId> org.elasticsearch.client </groupId> <artifactid> 운송 </artifactid> <버전> 5.5.0 </version> </fectionency> <groupId> org.elasticsearch.client </groupid> <tritifactid> 운송 </artifactid> version> 5.5.0 </dependency> </delation> <pectionency> <groupid> org.elasticsearch </groupid> <artifactid> elasticsearch </artifactid> <버전> 5.5.0 </version> </fectionency>
자, 종속성을 추가 한 후 ES 사용 단계에 들어갑니다. 그건 그렇고, 설명해야 할 문제가 있습니다. ES를 사용하려면 JDK1.8 툴킷을 설치해야하며 Tomcat은 버전 7.05 이상이어야합니다. 그렇지 않으면 ES가 지원되지 않으며 프로젝트에 통합 할 때 오류가보고 될 수 있습니다! , ES의 설치 및 다운로드도 있습니다. 다운로드 주소는 다음과 같습니다. https://www.elastic.co/downloads/elasticsearch
모든 것이 준비된 후에, 우리는 우리가 정말로 기대하는 순간에 들어갈 것입니다. 예, Java의 ES 서버의 내용을 검색하고 쿼리하는 방법은 다음과 같습니다.
먼저 ES 도구 클래스를 제안합니다
package com.osa.utils; import java.io.bufferedReader; import java.io.ioException; import java.io.inputStreamReader; import java.io.printwriter; import java.net.url; import java.net.urlconnection; import java.net.urlencoder; import java.util.util.utorator; java.util.list; import java.util.map; import java.util.set; import org.apache.http.client.clientProtocoLexception; import com.alibaba.attjson.jsonarray; import com.alibaba.astjson.jsonexception; import httttjson.jsonobjson.jsonobjson {/** * 지정된 URL * * @param url * url에 요청을 보내 요청 * @param param * 요청 매개 변수는 요청 매개 변수가 name1 = value1 & name2 = value2의 형태 여야합니다. * 원격 자원으로 표시되는 원격 자원의 @return URL 응답 결과*/ public static string sendget (String URL, String Param) {String result = ""; 버퍼드 리더 in = null; {string urlnamestring = url + "?" + PARAM; url realurl = new URL (urlnamestring); // URL URLCONNECTION CONNECTION 사이의 연결을 엽니 다. = realUrl.openConnection (); // 일반 요청 속성을 설정합니다. Connection.setRequestProperty ( "Connection", "Keep-Alive"); Connection.setRequestProperty ( "사용자 에이전트", "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)); } // 버퍼드 리더 입력 스트림을 정의하여 in = new bufferedReader에서 URL의 응답을 읽습니다 (new inputStreamReader (connection.getInputStream ())); 문자열 라인; while ((line = in.readline ())! = null) {result += line; }} catch (예외 e) {System.out.println ( "GET 요청을 보낼 때 예외가 발생했습니다!" + e); e.printstacktrace (); } // 입력 스트림을 닫으려면 마지막으로 블록을 사용하여 마지막으로 {try {if (in! = null) {in.close (); }} catch (예외 e2) {e2.printstacktrace (); }} 반환 결과; } /** * 지정된 URL * @param url * URL에 요청을 보내 요청 * @param param * 요청 매개 변수, 요청 매개 변수는 name1 = value1 & name2 = value2의 형태 여야합니다. * @return 응답 */ public static string sendpost (String URL, String Param) {printwriter out = null; 버퍼드 리더 in = null; 문자열 결과 = ""; try {url realurl = new URL (url); // urlConnection 사이의 연결을 엽니 다. conn = realurl.openConnection (); // 일반 요청 속성을 설정하여 Conn.setRequestProperty ( "accept", "*/*"); Conn.setRequestProperty ( "Connection", "Keep-Alive"); Conn.setRequestProperty ( "사용자 에이전트", "Mozilla/4.0 (호환 가능; MSIE 6.0; Windows NT 5.1; Sv1)"); // 게시물 요청을 보내려면 다음 두 줄을 Conn.SetDoOutput (true)로 설정해야합니다. conn.setdoinput (true); // urlConnection 객체에 해당하는 출력 스트림을 가져옵니다. // 요청 매개 변수를 보내십시오 .print (param); // 플러시 출력 스트림의 버퍼 out.flush (); // bufferedReader 입력 스트림을 정의하여 in in = new bufferedReader (new inputStreamReader (conn.getInputStream ()))의 응답을 읽습니다. 문자열 라인; while ((line = in.readline ())! = null) {result += line; }} catch (예외 e) {System.out.println ( "게시물 요청을 보낼 때 예외가 발생했습니다!" +e); e.printstacktrace (); } // 마침내 블록을 사용하여 출력 스트림을 닫고 입력 스트림을 마지막으로 {try {if (out! = null) {out.close (); } if (in! = null) {in.close (); }} catch (ioexception ex) {ex.printstacktrace (); }} 반환 결과; }} 도구 클래스를 사용할 수 있으면 요청을 보내는 두 가지 방법이 있음을 알 수 있습니다. 하나는 Sendget 및 SendPost 메소드입니다. 두 가지 방법은 자신의 선택에 따라 선택할 수 있습니다. 물론 이것은 요청을 보내는 방법 일뿐입니다. 그들에게 전화하는 방법? 여기서는 ES에서 쿼리를하기 때문에 mybatis 또는 최대 절전 모드 프레임 워크를 사용할 필요가 없습니다. 데이터 계층에서 직접 SQL을 정의 한 다음 SQL을 사용하여 다음과 같이 이전 공구 클래스를 통해 SendGet/SendPost 메소드를 호출 할 수 있습니다.
문자열 sql = urlencoder.encode ( "select * from tame"); 인코딩 메소드는 주로 SQL의 일부 공백을 제거합니다.
문자열 결과 = httpsentutils.sendget ( "http://221.124.71.8:9200/_sql", "sql ="+sql); IP Plus 포트를 설치할 때 구성 할 수 있습니다
좋아요! 일반적으로 현재 보내기가 성공하면 ES의 데이터를 검색 할 수 있습니다. 반환 된 JSON 데이터는 ES에서 JSON 문자열을 포맷합니다.
net.sf.json.jsonobject jsonobject = net.sf.json.jsonobject.fromobject (결과); // hits tag net.sf.json.jsonobject hitsjsonobject = jsonobject.getJsonObject ( "hits");
데이터를 얻은 후에는 비즈니스 운영이라는 결론을 내립니다. 거의 여기에 있습니다.
위의 일부는 쿼리의 일부 작업이므로 데이터를 ES에 배치 해야하는 경우 어떻게해야합니까? 예를 들어보세요
package 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;import org.elasticsearch.action.bulk.bulkresponse; import org.elasticsearch.action.action.index.indexrequestbuilder; import com.sojson.common.utils.stringutils import com.sojson.core.elasticsearch.utils.estools; public classinsertmanager {/*** 엘라스틱에 추가 된 데이터 추가 type*@param idname id 필드 이름*@param json 저장된 json은 map*@return*/publicstaticMapsave (문자열 인덱스, 문자열 유형, 문자열 idname, jsonobject json) {list list = newArrayList (); list.add (json); return save (index, type, idname, list); 전달 된 매개 변수는 처리되어 삽입 작업을 수행하기 위해 저장 메소드를 호출합니다.
/*** Elasticsearch*@param index index*@param type type*@param idname id 필드 이름*@param listdata 객체 모음*@return*/@suppresswarnings ( "Checked Unchecked") publicstaticMapsave (문자열, 문자열 유형, String idname, ListBuilder BulkRequest = estools.client.preparebulk (). setRefresh (true); map resultmap = newhashmap (); for (개체 객체 : listdata) {jsonobject json = jsonobject.fromobject (object); // idname이 지정되지 않으면 엘라스틱 검색이 자동으로 생성되도록하십시오. if (stringUtils.isblank (idname)) {indexrequestBuilder lrb = elasticsearchUtils.client .prepareIndex (index, type) .setSource (json); bulkrequest.add (lrb); // elasticsearchutils는 도구 클래스이며 일부 es configuration} else {string val} json.optstring (idname); indexrequestBuilder lrb = estools.client.prepareIndex (index, type, idvalue) .setSource (json); bulkrequest.add (lrb);}} bulkresponse bulkronse = bulkRequest.execute (). actionget (); if (bulkResponse.hasFailures ()) {// 각 벌크 응답 itemsystem.out.println (bulkResponse.getItems (). toString ()); resultMap.put ( "500", "return!" resultMap;} bulkRequest = estools.client.preparebulk (); resultMap.put ( "200", "Save Es!"); return resultMap;}} Elasticsearchutils 도구 클래스
공개 클래스 elasticsearchUtils {private static final String cluster_name = "cluster.name"; 개인 정적 최종 문자열 es_ip = "es.ip"; 개인 정적 최종 문자열 es_port = "es.port"; 개인 정적 설정 설정; 개인 정적 운송 클라이언트; 공개 정적 운송 클라이언트 getesclient (setingsss = preval static settents); settings.builder (). put (cluster_name, configutils.getConfig (cluster_name)). build (); if (client! = null) {client = new prebuilttransportClient (settings) .addtransportAddress (new inetSocketTransportAddress (inetAddress.getBig) integer.parseint (configutils.getConfig (es_port)));} return client;} 위는 삽입 ES 작업입니다. 좋아요, 그게 오늘 요약입니다. 나는 그것이 당신에게 약간의 도움을 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.