1. 기사 내용을 검색하기위한 아이디어
이전 기사는 Spring Boot 2.0에서 ES 5를 통합하는 방법에 대해 이야기했습니다. 이 기사는 특정한 실제 조치에 대해 이야기합니다. 기사와 질문 및 답변의 특정 구현을 구현하는 방법에 대해 간단히 이야기 해 봅시다. 구현 아이디어는 매우 간단합니다.
여기에서 바로 검색을 호출하면 불만족스러운 것을 쉽게 찾을 수 있습니다. 컨텐츠 검색은 컨텐츠 연결에 중점을두기 때문입니다. 따라서 여기서 처리 방법은 상대적으로 낮으며 더 많은 커뮤니케이션을 통해 더 나은 검색 방법을 달성하기를 바랍니다. 단어 분사를 통해 많은 문구를 얻은 다음 문구를 사용하여 문구를 정확하게 일치시키는 것입니다.
IK Word Segmenter 플러그인의 ES 설치는 매우 간단합니다. 첫 번째 단계는 해당 버전 https://github.com/medcl/elasticsearch-analysy-ik/releases를 다운로드하는 것입니다. 두 번째 단계는 Elasticsearch-5.5.3/플러그인 디렉토리에 새 폴더 IK를 생성하고 Elasticsearch-Analysis-IK-5.5.3.zip의 압축 된 파일을 Elasticsearch-5.1.1/Plugins/IK 디렉토리에 복사하는 것입니다. 마지막으로 es를 다시 시작합니다.
2. 컨텐츠 분사를 검색합니다
IK를 설치, 어떻게 호출 하는가?
첫 번째 단계는 여기에서 콘텐츠를 검색 할 때 Commas 스 플라이 싱으로 전달할 것입니다. 따라서 쉼표가 먼저 분할됩니다
두 번째 단계는 일부 단어가 IK 분사 후에 사라 졌기 때문에 검색어에 자신을 추가하는 것입니다 ... 이것은 버그입니다.
세 번째 단계는 IK 분사 후 analyzerequestBuilder 객체를 사용하여 리턴 값 객체 목록을 얻는 것입니다.
4 단계 : 단어 분사 결과를 최적화하십시오. 예를 들어, 모든 것이 단어라면 모든 것을 유지하십시오. 단어와 단어가 있다면 단어를 유지하십시오. 단어 만 있으면 단어를 유지하십시오.
핵심 구현 코드는 다음과 같습니다.
/ *** 검색 컨텐츠 분사*/ 보호 목록 <String> HandlingSearchContent (String SearchContent) {list <String> SearchTermResultList = New ArrayList <> (); // 검색어 목록 목록을 가져 오려면 쉼표로 분할 <String> SearchTermList = Arrays.AsList (SearchContent.Split (SearchConstant.String_Token_Split)); // 검색어가 1 단어보다 큰 경우, IK 단어 분사는 search list list list list list list list list list list list list list list list list list list list list list list list list list list list list list list list list list list list list list 자체를 추가하고 searchtermresultlist.add (search fermer); // search list termresultlist.addallms (getikanalyzes searchtersters) }); Return SearchResultList; } / *** IK 분사 후 결과를 얻으려면 ES에 전화를 걸어 결과를 얻으려면* / 보호 목록 <string> getikanalyzesearchterms (String SearchContent) {AnalyzEerequestBuilder ikrequest = new AnalyzEerequestBuilder (elasticsearchtemplate.get -indectant.instance, SearchConstant.name, SearchContent); ikrequest.settokenizer (searchConstant.tokenizer_ik_max); List <analyzeresponse.analyzetoken> iktokenlist = ikrequest.execute (). actionget (). getTokens (); // 루프 할당 목록 <String> SearchTermList = New ArrayList <> (); iktokenlist.foreach (iktoken-> {searchtermlist.add (iktoken.getterm ());}); 반환 handlingikresultterms (searchtermlist); } / ** * 단어 분사 결과 : 샴푸 (샴푸, 머리카락, 샴푸, 머리카락, 물) * - 모든 단어, keep * - 단어 + 단어, 단어 만 단어를 유지하는 것입니다 * / private list * / private list <string> handingikresultterms (list <string> searchtermlist) {boolean isphrase = false; 부울 isword = false; for (문자열 용어 : searchtermList) {if (term.length ()> searchConstant.search_term_length) {isphrase = true; } else {isword = true; }} if (isword & isphrase) {list <string> phraselist = new ArrayList <> (); searchtermlist.foreach (용어 -> {if (term.length ()> searchConstant.search_term_length) {phraselist.add (term);}}); 리턴 프레이즈리스트; } return searchtermList; }3. 검색어 문
내용 열거 개체를 구성하고 검색 해야하는 필드를 나열하십시오. contentsearchernum 코드는 다음과 같습니다.
import lombok.allargsconstructor; @allargsconstructorpublic enum contentsearchertermenum {// title title ( "title"), // content content ( "content"); / *** 검색 필드*/ 개인 문자열 이름; 공개 문자열 getName () {return name; } public void setName (문자열 이름) {this.name = 이름; }}"전화 검색 일치"검색 필드를 반복하고 최소 가중치 값을 1로 설정합니다. 핵심 코드는 다음과 같습니다.
/ *** 쿼리 조건 구성*/ private void buildMatchQuery (boolQueryBuilder QueryBuilder, List <string> search기리스트) {for (string search : searchtermList) {for (coctentSearchEnum searchNUMENUM : coptentSearchEnum.Values ()) { QueryBuilder.should (QueryBuilders.matchphraseQuery (searchtermenum.getName (), Searchterm); }} QueryBuilder.minimumshouldMatch (searchConstant.minimum_should_match); }4. 필터 조건
검색해야 할 것이 여러 개이며 때로는 수요가 다음과 같습니다. 특정 브랜드에서 제품을 검색하려면 전자 상거래와 같은 특정 범주에서 검색해야합니다. 그런 다음 필터링을 위해 일부 피팅을 구성해야합니다. SQL 문에 해당하거나 및 및 위치에 해당합니다. 필터 방법을 사용하여 ES로 필터링을 추가하십시오. 코드는 다음과 같습니다.
/ *** 빌드 필터*/ private void buildFilterQuery (boolqueryBuilder boolqueryBuilder, Integer Type, String Category) {// 컨텐츠 유형 필터 if (type! = null) {boolqueryBuilder saptilterBuilder = QueryBuilders.boolquery (); stupilterBuilder.should (QueryBuilders.matchQuery (searchConstant.type_name, type) .Lenient (true)); boolqueryBuilder.filter (stuptilterBuilder); } // 컨텐츠 카테고리 필터 if (! stringUtils.isempty (category)) {boolqueryBuilder CategoryFilterBuilder = QueryBuilders.boolquery (); CategoryFilterBuilder.should (QueryBuilders.matchQuery (SearchConstant.category_name, Category) .Lenient (True)); boolqueryBuilder.filter (CategoryFilterBuilder); }}유형은 큰 클래스이며 카테고리는 작은 클래스이므로 크기 및 클래스 필터링을 지원할 수 있습니다. 그러나 유형 = 1 또는 유형 = 2로 검색 해야하는 경우 어떻게해야합니까? 특정 구현 코드는 매우 간단합니다.
stiptilterBuilder .Hould (QueryBuilders.matchQuery (SearchConstant.type_name, 1) .Should (QueryBuilders.MatchQuery (SearchConstant.Type_name, 2) .Lenient (True));
체인 표현식을 통해, 두 개는 SQL에 해당하는 OR 문을 구현해야합니다. SQL에 해당하는 및 명령문의 구현은 2 개의 BoolqueryBuilders를 통해 달성됩니다.
5. 페이징 및 분류 조건
페이징 분류 코드는 매우 간단합니다.
@override public pagebean searchContent (contentsearchbean contentsearchbean) {Integer pagenumber = contentsearchbean.getPagenumber (); Integer Pagesize = contentsearchBean.getPagesize (); PageBean <contententity> resultPageBean = New PageBean <> (); resultPageBean.setPagenumber (pagenumber); resultPageBean.setPagesize (pagesize); // 검색어 구성 문자열 searchContent = contentsearchBean.getSearchContent (); list <string> searchtermlist = handlingsearchContent (SearchContent); // 쿼리 조건 빌드 boolqueryBuilder boolqueryBuilder = QueryBuilders.boolquery (); BuildMatchQuery (BoolQueryBuilder, SearchtermList); // 빌드 필터 조건 빌드 필터 QuelderQuery (boolqueryBuilder, contentsearchBean.getType (), contentsearchBean.getCategory ()); // 페이징 및 분류 조건을 구축 할 수있는 pagable = pagerequest.of (pagenumber, pagesize); if (! stringUtils.isempty (contentsearchBean.getOrderName ())) {pagable = pageRequest.of (pagenumber, pagesize, sort.direction.desc, contentsearchbean.getorderName ()); } SearchQuery SearchQuery = New NativeSearchQueryBuilder (). WiThPagable (pagable) .withQuery (boolqueryBuilder) .build (); // search logger.info ( " /n contentserViceimpl.searchContent () [" + searchContent + "] /n dsl = /n" + searchQuery.getQuery (). toString ()); Page <contententity> contentPage = ContentRecoritory.Search (SearchQuery); resultPageBean.setResult (contentPage.getContent ()); resultPageBean.setTotalCount ((int) contentpage.getTotalElements ()); resultPageBean.setTotalPage ((int) contentpage.getTotalElements ()); resultPageBean.setTotalPage ((int) contentpage.getTotalElements () / resultPageBean.getPagesize () + 1); 반환 결과 PageBean; }pagable 객체를 사용하여 페이징 매개 변수를 구성하고 해당 정렬 필드 및 정렬 순서 (DESC ASC)를 지정하십시오.
6. 요약
이 아이디어는 비교적 간단합니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.