ES 배포 및 프로그램 개발

자세히 보기
배경 설명:
시스템 검색 홍보 활동은 이전의 데이터베이스가 모호하게 일치하는 방식에서 검색엔진으로 전환하는 방식이다. 선택한 내용은 ElasticSearch를 위주로 한다. 본 문서에는 ES를 이용하여 단일 노드를 배치하고 ES 검색을 개발하는 코드 설명이 기록되어 있으며 마지막으로 일부 코드를 올려 참고할 수 있다.
 
시스템 환경:
배포 환경: CentOS 6.7 + JDK 1.7 + ElasticSearch 2.3.5
개발 환경: Windows 10 + JDK 1.7 + IDEA 2017
 
환경 준비:
통합 POM 의존성:
      
 
    org.apache.commons
    commons-lang3
    3.4


    org.springframework.data
    spring-data-elasticsearch
    2.0.4.RELEASE


    org.elasticsearch
    elasticsearch
    2.3.5


    org.aspectj
    aspectjrt
    1.7.1


    org.aspectj
    aspectjweaver
    1.7.1


    log4j
    log4j
    1.2.17


    com.alibaba
    fastjson
    1.2.17

 
 
Spring 구성을 추가하려면 다음과 같이 하십시오.
 
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
       xsi:schemaLocation="
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.0.xsd
      http://www.springframework.org/schema/aop 
      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
      http://www.springframework.org/schema/data/elasticsearch 
      http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd
      ">

    
    

    
    

    
    
        
    


 
 
데이터 엔티티를 만들고 데이터 필드에 일일이 대응하여 빠른 조회에 사용합니다.
  
public class AppPOJO {

    private int res_pk;
    private String res_kaipk;
    private String res_name;
    //   getter setter  

}

 
VO 엔티티를 만들고 필요한 경우 데이터 엔티티를 비즈니스 엔티티로 변환하고 다음을 반환합니다.
   
@Document(indexName = "testidex",type = "estype")
public class AppModel {
    @Id
private Integer appId; private String resName; 
    //         getter setter  
}

 
 
    
검색 기능 개발:
   
1. 데이터 계층:
기본 데이터 기반 제공, 기본 CRUD 작업 포함:
새로운 기능의 핵심 구현:
          
String pid = et.index(new IndexQueryBuilder()
        //        index
        .withIndexName(ESConst.ESIndexEnum.APPSEARCH.getName())
        //        Type
        .withType(ESConst.ESTypeEnum.APPSEARCH.getName())
        //     ID,          
        .withId("" + pojo.getRes_pk())
        //        
        .withSource(jsonData)
        .build()
);


  
2. 수정 기능 핵심 실현
 
IndexRequest indexRequest = new IndexRequest();
indexRequest.source(jsonData);
UpdateQuery updateQuery = new UpdateQueryBuilder()
        .withIndexName(ESConst.ESTypeEnum.APPSEARCH.getName())
        .withType(ESConst.ESTypeEnum.APPSEARCH.getName())
        .withId(""+pojo.getRes_pk())
        .withIndexRequest(indexRequest)
        .withClass(AppPOJO.class)
        .build();
et.update(updateQuery);

 
3. 삭제 기능 핵심 실현
   
DeleteQuery deleteQuery = new DeleteQuery();
deleteQuery.setQuery(QueryBuilders.termQuery("appId", ""+appUid));
deleteQuery.setIndex(ESConst.ESIndexEnum.APPSEARCH.getName());
deleteQuery.setType(ESConst.ESTypeEnum.APPSEARCH.getName());
et.delete(deleteQuery);

 
 
4. 메인 키에 따라 조회
StringQuery query = new StringQuery(
        QueryBuilders.termQuery("appId",appUid).toString()
);
AppPOJO appPOJO = et.queryForObject(query,AppPOJO.class);

여기서 반드시 주의해야 할 것은 이 API를 사용할 때 실체 모델에 대해 주석 표시를 해야 한다는 것이다. 상세한 것은 코드를 참조한다.
 
 
5. 모든 데이터를 조회하고 첫 페이지 전시에 사용하며 핵심 코드는 다음과 같다.
//   Scan      ,        
//       
SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withIndices(ESConst.ESIndexEnum.APPSEARCH.getName())
        .withTypes(ESConst.ESTypeEnum.APPSEARCH.getName())
        .withQuery(QueryBuilders.matchAllQuery())
        .withFilter(QueryBuilders.termQuery("res_online","y"))
        .withPageable(new PageRequest(0,1)).build();

//       ,      
String scrollId = et.scan(searchQuery, 1000, false);

//             
Page page = et.scroll(scrollId, 5000L,AppPOJO.class);
List content = null;
if(page.hasContent()){
    content = page.getContent();
}else{
    break;
}

 
 
6. 조회의 총 데이터를 얻는데 주로 프론트 데스크톱 페이지의 페이지 나누기에 사용된다.
SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withIndices(ESConst.ESIndexEnum.APPSEARCH.getName())
        .withTypes(ESConst.ESTypeEnum.APPSEARCH.getName())
        .withQuery(QueryBuilders.multiMatchQuery(condition
                ,"column1","column2"))
        .build();
long count = et.count(searchQuery);

 
이상과 같이 모든 데이터 층의 기초 API가 완성되었고 나머지 업무 코드는 사람마다 업무가 다르기 때문에 저는 일일이 공유하지 않겠습니다. 여러분은 스스로 보충할 수 있습니다.
 
마지막으로 상술한 것은 모두 핵심 코드입니다. 저는 프로젝트 테스트 코드를 첨부 파일에 보내서 여러분께 공유할 것입니다.
 
  • es_workspace.rar (14.3 KB)

  • 4
  • 다운로드: 0
  • 좋은 웹페이지 즐겨찾기