1. Ideas para buscar contenido de artículo
El artículo anterior habló sobre cómo integrar ES 5 en Spring Boot 2.0. Este artículo habla sobre las medidas prácticas específicas. Hablemos brevemente sobre cómo implementar la implementación específica de artículos, preguntas y respuestas. La idea de implementación es muy simple:
Si llama a la búsqueda directamente aquí, puede encontrar fácilmente cosas insatisfactorias. Porque la búsqueda de contenido se centra en la conectividad del contenido. Entonces, el método de procesamiento aquí es relativamente bajo, y espero lograr un mejor método de búsqueda con más comunicación. Es para obtener muchas frases a través del participio de las palabras, y luego usar frases para hacer coincidir con precisión las frases.
La instalación de ES del complemento IK Word Segmenter es muy simple. El primer paso es descargar la versión correspondiente https://github.com/medcl/elasticsearch-analysis-ik/releases. El segundo paso es crear una nueva carpeta IK en el directorio Elasticsearch-5. Finalmente reiniciar es.
2. Buscar participio de contenido
Instalar ik, ¿cómo llamarlo?
El primer paso es que cuando busque contenido aquí, lo pasaré con empalme de comas. Entonces las comas se dividirán primero
El segundo paso es agregarte a los términos de búsqueda, porque algunas palabras se han ido después del participio de IK ... este es un error
El tercer paso es usar el objeto AnalyzequestBuilder para obtener la lista de objetos de valor de retorno después del participio IK
Paso 4: Optimizar los resultados del participio de la palabra. Por ejemplo, si todas son palabras, entonces mantén todo; Si hay palabras y palabras, entonces mantenga las palabras; Si solo hay palabras, entonces mantenga las palabras.
El código de implementación central es el siguiente:
/ *** Search Content Participle*/ Protected List <String> HandlingSearchContent (String SearchContent) {list <String> SearchMreSultList = new ArrayList <> (); // dividido por comas para obtener la lista de la lista de términos de búsqueda <String> SearchtermList = arrays.aslist (searchContent.split (SearchConstant.string_token_split)); // Si el término de búsqueda es mayor que 1 palabra, el participio de la palabra IK se obtendrá obteniendo la lista de resultados del participio de la palabra la lista de búsqueda de SearchTermList.ForEach (SearchterM -> {// Search Term Etiqueta Agregue la lista de términos de búsqueda en sí mismo y resuelva el problema de Will SearchMreSultList.Add (SearchterM); // Search Term IK Participle ListarTMRResultListListListListListListall (getikanalyzeSearts (SearchTerm); }); return SearchTermResultList; } / *** Llame es para obtener el resultado después del participio IK* / Proteged List <String> getikanalyzesearchterms (String SearchContent) {AnalyZeRequestBuilder ikrequest = new AnalyZequestBuilder (elasticeSearchTemplate.getClient (), analzeAption.Instance, SearchConstant.IndEx_Name, SearchContent); ikrequest.setTokenizer (SearchConstant.Tokenizer_ik_Max); List <AnalyzeSponse.analyzetoken> iKTokenList = iKRequest.execute (). ActionGet (). GetTokens (); // Lista de asignación de bucle <String> SearchMermlist = new ArrayList <> (); iKTokenList.ForEach (iKToken -> {SearchMermList.Add (iKToken.getTerm ());}); return HandlingIkResultterms (SearchTermList); } / ** * Si el resultado del participio de las palabras: Shampoo (champú, cabello, champú, cabello, agua) * - son todas las palabras, mantenga * - palabras + palabras, solo palabras * - son todas las palabras, mantenga palabras * / lista privada <tring> maneikresultterms (list <string> searchterlist) {boolean isfrase = falso; Boolean isword = false; for (término de cadena: searchtermList) {if (term.length ()> searchConstant.search_term_length) {isPhrase = true; } else {isword = true; }} if (isword & isphrase) {list <String> Phraselist = new ArrayList <> (); SearchMermList.ForEach (Term -> {if (Term.Length ()> SearchConstant.search_term_length) {PhrasElist.add (Term);}}); return Phraselist; } return SearchTermList; }3. Declaración de consulta de búsqueda
Construya el objeto de enumeración de contenido y enumere los campos que deben buscar. El código ContentdearchterMenum es el siguiente:
import lombok.alLargSconstructor; @AllargSconstructorPublic enum ContentsearchterMenum {// título Título ("Título"), // Content Content ("Content"); / *** Campo de búsqueda*/ Nombre de cadena privada; public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; }}Enojar el campo de búsqueda de "búsqueda de teléfono" y establezca el valor de peso mínimo en 1. El código central es el siguiente:
/ *** Construir condiciones de consulta*/ private void buildMatchQuery (boolQueryBuilder QueryBuilder, List <String> SearchMeMList) {for (String SearchterM: SearchMeMList) {for (ContentSearchMeNum SearchterMeNum: ContentSearchMeNum.Values ()) { QueryBuilder.should (QueryBuilders.MatchPhraseQuery (SearchterMeNum.getName (), SearchterM)); }} QueryBuilder.MinimumShouldMatch (SearchConstant.Minimum_Should_Match); }4. Condiciones de filtro
Hay más de una cosa que buscar, y a veces la demanda es así. Debe buscar en una determinada categoría, como el comercio electrónico necesita buscar productos bajo una determinada marca. Luego, debe construir algunos fitlers para el filtrado. Correspondiente a las declaraciones SQL, o y y, bajo dónde. Use el método de filtro para agregar filtrado en ES. El código es el siguiente:
/ *** Build Filters*/ private void buildFilterQuery (boolQueryBuilder boolQueryBuilder, tipo entero, categoría de cadena) {// Content Type Filter if (type! = Null) {boolQueryBuilder typeFilterBuilder = QueryBuilders.BoolQuery (); typefilterBuilder.should (QueryBuilders.MatchQuery (SearchConstant.Type_Name, Type) .Lenient (True)); boolQueryBuilder.filter (TypeFilterBuilder); } // Filtro de categoría de contenido if (! StringUtils.isEmpty (categoría)) {BoolQueryBuilder CategyFilterBuilder = QueryBuilders.BoolQuery (); CategyFilterBuilder.should (QueryBuilders.MatchQuery (SearchConstant.Category_Name, Categoría) .Lenient (True)); boolQueryBuilder.filter (categoryFilterBuilder); }}El tipo es una clase grande y la categoría es una clase pequeña, para que pueda admitir el tamaño y el filtrado de clase. Pero, ¿qué pasa si necesita buscar en type = 1 o type = 2? El código de implementación específico es muy simple:
TypeFilterBuilder .should (QueryBuilders.MatchQuery (SearchConstant.Type_Name, 1) .should (QueryBuilders.MatchQuery (SearchConstant.Type_Name, 2) .Lenient (verdadero));
A través de expresiones de cadena, dos deben implementar o, es decir, la declaración OR correspondiente a SQL. La implementación de la Declaración y correspondiente a SQL se logra a través de dos boolquerybuilders.
5. Condiciones de paginación y clasificación
El código de clasificación de la paginación es muy simple:
@Override public PageBean SearchContent (ContentSearchBean ContentSearchBean) {Integer PageNumber = ContentSearchBean.getPageNumber (); Entero pageSize = contentsearchBean.getPageSize (); PageBean <ClenttEntity> ResultPageBean = new PageBean <> (); resultPagebean.setPageNumber (PageNumber); resultPagebean.SetPageSize (PageSize); // construir frase de búsqueda cadena SearchContent = ContentSearchBean.getSearchContent (); List <String> SearchMermList = HandlingSearchContent (SearchContent); // Construir condiciones de consulta boolQueryBuilder boolQueryBuilder = QueryBuilders.BoolQuery (); BuildMatchQuery (BoolQueryBuilder, SearchTermList); // Construir condiciones del filtro BuildFilterQuery (boolQueryBuilder, contentsearchBean.gettype (), contentsearchBean.getCategory ()); // Construir condiciones de paginación y clasificación que se puede concentrar = pagequest.of (pageNumber, pageSize); if (! stringUtils.isEmpty (contentsearchBean.getOrderName ())) {pageable = pagequest.of (pageNumber, pageSize, sort.Direction.Desc, contentsearchBean.getOrderName ()); } SearchQuery SearchQuery = New NatesearchQueryBuilder (). Withpagable (pagible) .withQuery (boolQueryBuilder) .Build (); // Search logger.info (" /n ContentServiceImpl.SearchContent () [" + SearchContent + "] /n DSL = /N" + SearchQuery.getQuery (). ToString ()); Página <CententEntity> ContentPage = ContentRepository.Search (SearchQuery); resultPagebean.setResult (contentPage.getContent ()); resultPagebean.settotalCount ((int) contentPage.getToTalElements ()); resultPagebean.settotalPage ((int) contentPage.getToTalElements ()); resultPagebean.settotalPage ((int) contentPage.getToTalElements () / resultPageBean.getPageSize () + 1); return resultPagebean; }Use el objeto pagible para construir parámetros de paginación y especifique los campos de clasificación correspondientes y el orden de clasificación (DESC ASC).
6. Resumen
Esta idea es relativamente simple. Espero que sea útil para el aprendizaje de todos, y espero que todos apoyen más a Wulin.com.