얼마 전, 프로젝트에 대한 간단한 검색 서비스를 구축 할 계획이었습니다. 비즈니스 데이터베이스 MongoDB는 텍스트 검색 지원을 제공하지만 많은 문서를 키워드를 통해 배치해야 할 때 ES는 검색 엔진으로 더 적합합니다 (대부분의 사람들은 ELK의 분석 및 시각화 기능을 사용했지만). Elasticsearch는 Lucene을 기반으로하며 매우 빠른 쿼리와 풍부한 쿼리 구문을 지원하며 때로는 가벼운 NOSQL 역할을합니다. 그러나 복잡한 쿼리 및 집계 작업 능력은 그다지 강력하지 않습니다.
이 기사는 간단한 검색 서비스를 구축하는 방법을 언급하지는 않지만 약 일주일의 근무 시간 동안 발생하는 몇 가지 함정을 기록합니다. .
Elasticsearch 5.x를 선택하는 이유는 무엇입니까?
새로운 서비스는 역사적 부담이 없으며 이론적으로는 최신 6.x를 사용해야합니다. 그러나 Spring-Data-Elasticsearch는 5.x 만 지원하며 시간이 빡빡하더라도 API 층을 직접 캡슐화하기가 어렵습니다. 또한 엘크의 이전 버전은 혼란 스러웠 기 때문에 2.x에서 5.x로 이동하는 것 외에는 선택의 여지가 없었습니다. 5.x와 2.x의 차이점을 쿼리하십시오. 간단히 말해서, 디스크 공간 -50%, 색인 시간 -50%, 쿼리 성능 +25%입니다.
Spring-Data-Elasticsearch는 3.0.7로 업그레이드되어야하므로 스프링은 2.x로 업그레이드되어야하며, 이는 나중에 강타하는 함정으로 직접 연결됩니다.
Docker Installation ES는 기본적으로 X-Path 플러그인을 설치합니다
Spring-Data는 ES5.X를 지원하지만 그 기능은 그다지 완전하지 않습니다. 따라서 X-Path 플러그인이 설치되면 org.elasticsearch.client : x-pack-transport : 5.5.0을 도입해야합니다. 버전은 ES 버전과 동일해야하며 다음과 같이 전송 클리어를 직접 구현할 수 있습니다.
@ComponentPublic Class EsconFig {@Bean Public TransportClient TransportClient ()는 미지의 hostException {transportClient Client = New PrebuiltXpackTransportClient (settings.builder ( "cluster.name") .put ( "xpack.seciturity.user")). .addtransportAddress (새로운 inetSockettransportAddress (inetAddress.getByName ( "0.0.0.0"), 9300); 반환 클라이언트; }}이것은 X-Path 플러그인을 처리하기 위해 Docker로 가고 싶지 않기 때문에 선택된 더 빠른 솔루션입니다. 불필요하다면, 당분간 ES 자체에서 어떤 것들을 만질 필요가 없습니다.
MQ는 메시지의 클래스 정보를 저장하여 실패로 인해 실패합니다.
제목의 RabbitMQ는 메시지 대기열로 사용되기 때문에 언급 된 적이 없습니다. 데이터가 변경되면 메시지 ID가 MQ에 던져지고 검색 서비스의 소비자가 소비됩니다.
문제는 메시지가 MQ로 던져지면 자체 객체로 캡슐화되어 RabbitTemplate.receiveAndConvert가 객체 패키지 정보를 전달하기 때문에 실패하게한다는 것입니다. 절망적으로 소비자는 큐에서 메시지 바이트 만 직접 얻을 수 있으며 객체 mapper.readValue 메소드를 사용하여 JSON 양식을 객체로 변환 할 수 있습니다.
Gradle 구성은 -dloader.main을 사용하여 시작 기능을 지정할 수 있습니다.
MQ가 소비자를 시작해야한다는 것은 MQ가 소개 되었기 때문에 정확히 이루어지기 때문입니다. 이 방법은 웹 서비스를 시작하지 않는 응용 프로그램을 구현하고 다음과 같이 SimplemesSagelistenerContainer 및 Messagelisteneradapter를 구성하는 것입니다.
@Bean SimpleMessAgelistenerContainer 컨테이너 (ConnectionFactory ConnectionFactory, MessageListenerAdapter LeargeRadapter, MQConfig Properties) {SimplemessAgelistenerContainer Container = New SimplemessAgelistenerContainer (); container.setConnectionFactory (ConnectionFactory); container.setqueuenames (properties.getqueueName ()); Container.SetMessAgelistener (LesserAdapter); 반환 컨테이너; } @Bean MessagelistenerAdapter LeargeRadapter () {MessageListenerAdapter LearerAdapter = New MessagelistenerAdapter (ItemConsumer, "COUTIME"); 리시 레너 라인 랩터를 반환합니다. } 문제는 Gradle 구성이있을 때 STARTUP 애플리케이션을 지정하기 위해 지정된 -dloader.main으로 제작 된 JAR 패키지를 만들기 위해 오랜 시간을 검색했다는 것입니다. 솔루션은 다음과 같습니다.
xxx.gradle 파일을 추가하십시오
bootjar {manifest {attributes 'main-class': 'org.springframework.boot.loader.propertieslauncher'}}SpringBoot 1.5.9 프로젝트에서는 시작 응용 프로그램을 지정해야하며 추가해야합니다.
SpringBoot {Layout = "Zip"}그것이 효과적인 지 확인하는 방법은 제작 후 JAR 패키지를 직접 압축하고 xxx (프로젝트 이름)/meta-info/manifest.mf로 확인하는 것입니다.
메인 클래스 : org.springframework.boot.loader.propertieslauncher
그런 다음 수정하십시오
메인 클래스 : org.springframework.boot.loader.jarlauncher
파일의 스타트 클래스가 여전히 시작됩니다
ES는 인덱스 매핑을 수정할 수 없습니다
단순히 ES의 텍스트 검색 기능을 사용하기 때문에 "책상"검색과 같은 실제 응용 프로그램에는 불만족스러운 검색 결과가 많이 있으며 "컴퓨터 데스크/사무실 데스크"및 기타 XX 테이블과 같은 콘텐츠를 검색하는 것은 불가능합니다. 이런 식으로 많은 경우가 있습니다. 따라서 동의어 사전이 추가되고 IK_Smart 워드 세그먼터는 단어 세그먼트 화가 필요한 필드에서 사용되지 않으므로 일부 필드의 매핑을 변경해야합니다.
// 분석기는 고유 한 단어 세그먼터 이름 @field (type = fieldType.Text, index = true, analyzer = "synconym") 개인 문자열 설명;
ES '매핑을 수정할 수 없으므로 새 매핑 만 수동으로 만 작성 한 다음 Reindex 메소드를 사용하여 데이터를 백필 할 수 있습니다 (ES5.X는 Reindex API와 함께 제공). 별명을 통해 온라인 방법이 있습니다. 일부 수정 시나리오에서는 응용 프로그램을 다시 시작/배포하지 않고도 매핑을 원활하게 수정할 수 있습니다. 자세한 내용은 쿼리하고 이해할 수 있습니다.
위의 것은 거의 검색 서비스에 의해 촉발 된 함정입니다. 그들 중 일부는 해결하기 위해 많은 시간과 에너지를 소비했습니다. 이 목록의 참조 가치가되기를 바랍니다. 앞으로 검색 서비스에 약간의 최적화가있을 것이며 계속 느리게 업데이트 될 것입니다. 또한 모두가 wulin.com을 더 지원하기를 바랍니다.