springboot 2.0+elasticsearch 5.5+rabbitmq 검색 서비스의 구덩이 구축

얼마 전에 프로젝트 에 간단 한 검색 서 비 스 를 구축 하려 고 했 습 니 다.비록 업무 데이터 뱅 크 mongodb 는 텍스트 검색 을 지원 하지만 대량의 문서 가 키 워드 를 통 해 포 지 셔 닝 을 해 야 할 때 es 는 검색엔진 으로 더욱 적합 합 니 다(비록 우리 가 예전 에 대부분 ELK 의 분석 과 시각 화 된 특성 을 사 용 했 지만).Elasticsearch 는 Lucene 위 에 세 워 져 있 으 며 빠 른 조회 와 풍부 한 조회 문법 을 지원 합 니 다.가끔 은 경량급 NoSQL 로 도 사용 할 수 있 습 니 다.그러나 복잡 한 조회 와 취 합 작업 에 대한 능력 은 그리 강하 지 않다.
이 편 은 간단 한 검색 서 비 스 를 만 드 는 방법 에 대해 서 는 언급 하지 않 고 약 일주일 동안 근무 시간 에 만난 몇 개의 구 덩이 를 기록 합 니 다.
왜 elasticsearch 5.x 를 선 택 했 습 니까?
새로운 서 비 스 는 역사적 인 부담 이 없 기 때문에 이론 적 으로 최신 6.x 를 사용 해 야 한다.그러나 spring-data-elasticsearch 는 5.x 만 지원 하고 시간 이 촉박 해서 api 를 직접 포장 할 수 없 는 것 도 ELK 의 이전 버 전이 혼 란 스 러 웠 기 때문에 어 쩔 수 없 이 es 는 2.x 에서 5.x 로 직접 도착 했다.5.x 와 2.x 의 차 이 를 조회 해 보 세 요.쉽게 말 하면 디스크 공간-50%,색인 시간-50%,조회 성능+25%입 니 다.
spring-data-elasticsearch 는 3.0.7 로 업그레이드 해 야 하기 때문에 spring 은 2.x 로 업그레이드 해 야 하고 뒤에서 밟 은 구 덩이 를 직접 초래 합 니 다.
docker 설치 es 는 기본적으로 x-path plugin 을 설치 합 니 다.
spring-data 는 es5.x 를 지원 하지만 기능 이 완선 되 지 않 습 니 다.따라서 x-path 플러그 인 이 설치 되 어 있 으 면 org.elasticsearch.client:x-pack-transport:5.5.0 을 도입 해 야 합 니 다.버 전 은 es 버 전과 일치 하고 스스로 TransportClient 를 실현 해 야 합 니 다.다음 과 같 습 니 다.

@Component
public class ESconfig {
 @Bean
 public TransportClient transportClient() throws UnknownHostException {
  TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
    .put("cluster.name", "docker-cluster")
    .put("xpack.security.user", "elastic:changeme")
    .build())
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("0.0.0.0"), 9300));
  return client;
 }
}
이것 도 docker 에서 x-path 라 는 플러그 인 을 처리 하고 싶 지 않 기 때문에 비교적 빠 른 해결 방안 을 선택 한 것 입 니 다.필요 없 는 상황 에서 당분간 es 자체 의 일부 물건 을 접 하지 않 아 도 됩 니 다.
mq 는 message 의 class 정 보 를 저장 하여 deserialized 에 실 패 했 습 니 다.
제목 에 있 는 rabbitmq 는 언급 되 지 않 았 습 니 다.단순히 메시지 큐 로 사용 하기 때문에 데이터 가 변 할 때 메시지 id 를 mq 에 버 리 고 search 서비스 쪽 consumer 에서 소비 합 니 다.
문 제 는 메시지 가 mq 에 버 려 졌 을 때 자신의 Object 로 봉 하여 rabbitTemplate.receive AndConvert 를 사용 하 는 데 실 패 했 습 니 다.message 는 Object 의 package 정 보 를 가지 고 있 기 때 문 입 니 다.어 쩔 수 없 이 consumer 는 quue 의 message bytes 를 직접 가 져 올 수 밖 에 없 었 고 Object Mapper.readValue 의 방법 으로 json 형식 을 Object 로 바 꿀 수 밖 에 없 었 다.
gradle 설정 은-Dloader.main 에서 시작 함 수 를 지정 할 수 있 습 니 다.
mq 가 도입 되 었 기 때문에 search 서 비 스 는 consumer 를 시작 해 야 합 니 다.웹 서 비 스 를 시작 하지 않 는 애플 리 케 이 션 을 따로 실현 하고 Simple Message Listener Container 와 Message Listener Adapter 를 설정 하 는 방법 은 다음 과 같 습 니 다.

 @Bean
 SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
   MessageListenerAdapter listenerAdapter,
   MQconfig properties) {
  SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
  container.setConnectionFactory(connectionFactory);
  container.setQueueNames(properties.getQueueName());
  container.setMessageListener(listenerAdapter);

  return container;
 }

 @Bean
 MessageListenerAdapter listenerAdapter() {
  MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(itemConsumer,
    "consume");
  return listenerAdapter;
 }
문 제 는 gradle 설정 을 할 때 build 에서 나 온 jar 패 키 지 를 어떻게 지정 할 수 있 는 지 오래 찾 았 습 니 다.-dloader.main 에서 시작 애플 리 케 이 션 을 지정 할 수 있 습 니 다.해결 방법 은 다음 과 같 습 니 다.
xxx.gradle 파일 에 추가

bootJar {
 manifest {
  attributes 'Main-Class': 'org.springframework.boot.loader.PropertiesLauncher'
 }
}
springboot 1.5.9 프로젝트 에서 시작 애플 리 케 이 션 을 지정 해 야 합 니 다.추가 해 야 합 니 다.

springBoot{
 layout = "ZIP"
}
유효 여 부 를 확인 하 는 방법 은 build 이후 jar 가방 을 직접 풀 고 xxx(프로젝트 이름)/META-INFO/MANIFEST.MF 에서 확인 하 는 것 입 니 다.만약 에...
Main-Class: org.springframework.boot.loader.PropertiesLauncher
하면,만약,만약...
Main-Class: org.springframework.boot.loader.JarLauncher
파일 에 있 는 Start-Class 를 시작 합 니 다.
es 인덱스 의 mapping 을 수정 할 수 없습니다.
단순히 es 의 텍스트 검색 기능 만 사 용 했 기 때문에 실제 응용 할 때 검색 결과 가 만 족 스 럽 지 못 한 부분 이 많다.예 를 들 어'책상'을 검색 하고'컴퓨터 책상/책상'등 xx 책상 내용 을 검색 하지 못 하 는 경우 도 많다.따라서 synonym dictionary 를 추가 하여 단어 가 필요 한 필드 에 자신의 ik 를 사용 하지 않 습 니 다.smart 단어 기,이러한 필드 의 mapping 을 변경 해 야 합 니 다.

 // analyzer         
 @Field(type = FieldType.Text, index = true, analyzer = "synonym")
 private String description;
es 의 mapping 을 수정 할 수 없 기 때문에 수 동 으로 새로운 mapping 을 만 들 고 reIndex 방법 으로 backfill 데이터(es5.x 는 reIndex api 를 가 져 왔 습 니 다).인터넷 에는 alias 를 통 해 일부 수정 장면 에서 애플 리 케 이 션 을 다시 시작 하거나 배치 하지 않 아 도 매 핑 을 부 드 럽 게 수정 할 수 있 습 니 다.구체 적 으로 조회 할 수 있 습 니 다.
이상 의 차 이 는 검색 서비스 가 밟 은 구 덩이 를 많이 만 들 지 않 았 고 몇 개 는 많은 시간 과 정력 을 들 여 해결 했다.여기 서 참고 가치 가 있 기 를 바란다.이후 검색 서 비 스 는 최 적 화 된 부분 이 있 고 천천히 업 데 이 트 될 것 이 며 많은 응원 부 탁 드 리 겠 습 니 다.

좋은 웹페이지 즐겨찾기