1. Idéias para pesquisa no conteúdo do artigo
O artigo anterior falou sobre como integrar o ES 5 no Spring Boot 2.0. Este artigo fala sobre as medidas práticas específicas. Vamos falar brevemente sobre como implementar a implementação específica de artigos e perguntas e respostas. A ideia de implementação é muito simples:
Se você ligar diretamente na pesquisa aqui, poderá encontrar facilmente coisas insatisfatórias. Porque a pesquisa de conteúdo se concentra na conectividade do conteúdo. Portanto, o método de processamento aqui é relativamente baixo e espero obter um método de pesquisa melhor com mais comunicação. É para obter muitas frases através do particípio de palavras e, em seguida, usar frases para combinar com precisão frases.
A instalação do plug-in do segmento de palavras IK é muito simples. A primeira etapa é baixar a versão correspondente https://github.com/medcl/elasticsearch-analysis-ik/releases. A segunda etapa é criar uma nova pasta IK no diretório Elasticsearch-5.5.3/plugins e copiar o arquivo descompactado do Elasticsearch-Analysis-IK-5.5.3.zip para o diretório elasticsearch-5.1.1/plugins/ik. Finalmente reinicie es.
2. Particípio do conteúdo da pesquisa
Instale o IK, como chamá -lo?
O primeiro passo é que, quando procuro conteúdo aqui, vou passar por splicing de vírgulas. Então as vírgulas serão divididas primeiro
O segundo passo é adicionar -se aos termos de pesquisa, porque algumas palavras desapareceram após o particípio IK ... este é um bug
A terceira etapa é usar o objeto AnalyzeReQuestBuilder para obter a lista de objetos do Valor de Retorno após o particípio IK
Etapa 4: otimize os resultados do particípio da palavra. Por exemplo, se todos são palavras, mantenha tudo; Se houver palavras e palavras, mantenha as palavras; Se houver apenas palavras, mantenha as palavras.
O código de implementação principal é o seguinte:
/ *** Pesquise o particípio de conteúdo*/ Lista protegida <String> handlingsearchContent (string searchContent) {list <string> search termResultList = new ArrayList <> (); // dividido por vírgulas para obter a lista de termos de pesquisa <StramPermList = Arrays.asList (SearchContent.split (SearchConstant.string_token_split)); // Se o termo de pesquisa for maior que 1 palavra, o particípio da palavra IK será obtido com a obtenção da palavra Participe List List PesarchTermList.ForEach (Search Term -> {// Termo de pesquisa de pesquisa Adicione a lista de termos de pesquisa e resolver o problema da pesquisa de pesquisa de pesquisa de pesquisa de pesquisa }); Retornar SearchTermResultList; } / *** Ligue para obter o resultado após o particípio IK* / Lista protegida <string> getikanalyzesearchterms (string searchContent) {analiseQuestBuilder ikRequest = new AnalyzeReQuestBuilder (ElasticsearchTemplate.getClient (), analazeation.InStance, pesquhConStant.iSTICENIND.SeSTCOLIND.ESTCOLENT. ikrequest.setTokenizer (SearchConstant.tokenizer_ik_max); List <analSenesponse.AnalyzeToken> iktokenList = ikrequest.execute (). ActionGet (). GetTokens (); // Lista de atribuições de loop <String> search termlist = new ArrayList <> (); iktokenList.ForEach (iktoken -> {search termlist.add (iktoken.getterm ());}); return handlingikResultterms (SearchTermList); } / ** * Se o resultado do particípio da palavra: shampoo (shampoo, cabelo, shampoo, cabelo, água) * - são todas as palavras, mantenha * - palavras + palavras, apenas palavras * - são todas as palavras, mantenha palavras * / list private <string> handiikResultterms (list <string> searchTermList) {boolean isphrasase = false; Booleano isword = false; for (termo string: search terminad) {if (term.length ()> searchConstant.search_term_length) {isphrase = true; } else {isword = true; }} if (isword & isphrase) {list <tring> phraselist = new ArrayList <> (); SearchTermList.ForEach (termo -> {if (Term.Length ()> SearchConstant.Search_Term_Length) {phraselist.add (termo);}}); Fraselista de retorno; } retornar pesquisa de pesquisa; }3. Declaração de consulta de pesquisa
Construa o objeto de enumeração de conteúdo e liste os campos que precisam ser pesquisados. O Código do ContendsEarchTerMenum é o seguinte:
importar lombok.allargsconstructor; @allargsconstructorpublic enum contentsarchtermenum {// title title ("title"), // Content Content ("content"); / *** Campo de pesquisa*/ nome da string privada; public String getName () {Return Name; } public void setName (nome da string) {this.name = name; }}Faça o campo de pesquisa "Pesquisa por telefone" e defina o valor mínimo de peso como 1. O código principal é o seguinte:
/ *** CONSTRUÇÃO CONDIÇÕES DE CONSULTA*/ private void BuildMatchQuery (BoolQueryBuilder QueryBuilder, List <String> SearchTermList) {for (String SearchTerm: SearchTermList) {for (contentsarchtermenum SearchTermEnum: contentSearchTermenum.Values ()) { querybuilder.should (querybuilders.matchphraseQuery (SearchTermenum.getName (), SearchTerm)); }} querybuilder.MinimumshouldMatch (SearchConstant.minimum_should_match); }4. Condições de filtro
Há mais de uma coisa a procurar e, às vezes, a demanda é assim. Você precisa pesquisar em uma determinada categoria, como o comércio eletrônico precisa procurar produtos sob uma determinada marca. Então você precisa construir alguns fitlers para filtrar. Correspondendo a declarações SQL, ou e e, sob onde. Use o método do filtro para adicionar filtragem no ES. O código é o seguinte:
/ *** Filtros de construção*/ private void BuildFilterQuery (BoolQueryBuilder BoolQueryBuilder, tipo inteiro, categoria String) {// Tipo de conteúdo Filtro se (tipo! typefilterbuilder.should (querybuilders.matchQuery (searchconstant.type_name, tipo) .lenient (true)); boolquerybuilder.filter (typefilterbuilder); } // filtro de categoria de conteúdo if (! StringUtils.isEmpty (categoria)) {BoolQueryBuilder CategoryFilterBuilder = querybuilders.BoolQuery (); categoryfilterbuilder.should (querybuilders.matchQuery (SearchConstant.category_name, categoria) .lenient (true)); boolquerybuilder.filter (categoryfilterbuilder); }}O tipo é uma classe grande e a categoria é uma classe pequena, para que possa suportar o tamanho e a filtragem de classe. Mas e se você precisar pesquisar no tipo = 1 ou tipo = 2? O código de implementação específico é muito simples:
typefilterbuilder .Would (QueryBuilders.matchQuery (SearchConstant.Type_Name, 1) .Should (QueryBuilders.MatchQuery (SearchConstant.Type_Name, 2) .lenient (true));
Através de expressões em cadeia, duas devem implementar ou, isto é, a declaração ou correspondente ao SQL. A implementação da declaração e correspondente ao SQL é alcançada por meio de dois boolquerybuilders.
5. Condições de paginação e classificação
O código de classificação de paginação é muito simples:
@Override Public PageBean SearchContent (contentSearchBean contentSearchBean) {Integer pagenumber = contentsEarchBean.getPagENumber (); Inteiro pageSize = contentsEarchBean.getPagesize (); PageBean <Centententity> resultPageBean = new PageBean <> (); resultadopageBean.SetPageNumber (PagenBumber); resultadoPageBean.SetPagesize (Pagesize); // Construa a frase de pesquisa string searchContent = contentsEarchBean.getSearchContent (); List <String> SearchTermList = HandlingSearchContent (SearchContent); // Construa condições de consulta boolquerybuilder boolquerybuilder = querybuilders.boolquery (); BuildMatchQuery (BoolQueryBuilder, SearchTermList); // construir condições de filtro BuildFilterQuery (boolqueryBuilder, contentsEarchBean.getType (), contentsEarchBean.getCategory ()); // Construa condições de paginação e classificação pagáveis pagáveis = pageRequest.of (pagenumber, PageSize); if (! stringUtils.isEmpty (contentsEarchBean.getOrderName ())) {pageable = pagerequest.of (pagenumber, pagageSize, sort.direction.desc, contentsEarchBean.getOrderName ()); } SearchQuery SearchQuery = new NativearchQueryBuilder (). Compagável (pagável) .WithQuery (boolQueryBuilder) .build (); // pesquisa logger.info (" /n contentServiceImpl.searchContent () [" + searchContent + "] /n dsl = /n" + searchquery.getQuery (). Tostring ()); Página <CENTENTENTITY> contentPage = contentRepository.search (SearchQuery); resultadoPageBean.SetResult (contentPage.getContent ()); resultadopageBean.setTotalCount ((int) contentPage.getToTalElements ()); resultadopageBean.setTotalPage ((int) contentPage.getToTalElements ()); resultadopageBean.setTotalPage ((int) contentPage.getToTalElements () / resultadopageBean.getPagesize () + 1); Retorno ResultPageBean; }Use o objeto pagável para construir parâmetros de paginação e especificar os campos de classificação correspondentes e a ordem de classificação (DESC ASC).
6. Resumo
Essa ideia é relativamente simples. Espero que seja útil para o aprendizado de todos, e espero que todos apoiem mais o wulin.com.