diff --git a/src/main/java/com/manalejandro/arjion/controllers/MainController.java b/src/main/java/com/manalejandro/arjion/controllers/MainController.java index a15d62b..4331d7f 100644 --- a/src/main/java/com/manalejandro/arjion/controllers/MainController.java +++ b/src/main/java/com/manalejandro/arjion/controllers/MainController.java @@ -130,7 +130,7 @@ public class MainController { Files.write(path, bytes); } // Añade los parámetros al VO para mostrar en la vista - documentoVO.getArchivos().add(new Archivo(filename, String.valueOf(archivos[i].getSize()), meta, + documentoVO.getArchivos().add(new Archivo(filename, Long.valueOf(archivos[i].getSize()).intValue(), meta, handler.toString(), identifier.getLanguage())); } } @@ -143,7 +143,7 @@ public class MainController { DetailVO detailVO = new DetailVO(); ObjectMapper mapper = new ObjectMapper(); Documento doc = mainService.findOne(nombre); - detailVO.setArchivo(new Archivo(doc.getNombre(), doc.getTamano().toString(), + detailVO.setArchivo(new Archivo(doc.getNombre(), doc.getTamano(), mapper.convertValue(doc.getMetadata(), Map.class), doc.getContenido(), doc.getLenguaje())); model.addAttribute("detailVO", detailVO); return "detail"; diff --git a/src/main/java/com/manalejandro/arjion/model/Archivo.java b/src/main/java/com/manalejandro/arjion/model/Archivo.java index c3d75c6..1d1ed39 100644 --- a/src/main/java/com/manalejandro/arjion/model/Archivo.java +++ b/src/main/java/com/manalejandro/arjion/model/Archivo.java @@ -5,12 +5,12 @@ import java.util.Map; public class Archivo { private String nombre; - private String tamano; + private Integer tamano; private Map metadata; private String contenido; private String lenguaje; - public Archivo(String nombre, String tamano, Map metadata, String contenido, String lenguaje) { + public Archivo(String nombre, Integer tamano, Map metadata, String contenido, String lenguaje) { this.nombre = nombre; this.tamano = tamano; this.metadata = metadata; @@ -28,7 +28,7 @@ public class Archivo { /** * @return the tamano */ - public String getTamano() { + public Integer getTamano() { return tamano; } @@ -56,7 +56,7 @@ public class Archivo { /** * @param tamano the tamano to set */ - public void setTamano(String tamano) { + public void setTamano(Integer tamano) { this.tamano = tamano; } diff --git a/src/main/java/com/manalejandro/arjion/model/Consulta.java b/src/main/java/com/manalejandro/arjion/model/Consulta.java new file mode 100644 index 0000000..aaa36a1 --- /dev/null +++ b/src/main/java/com/manalejandro/arjion/model/Consulta.java @@ -0,0 +1,52 @@ +package com.manalejandro.arjion.model; + +import java.util.ArrayList; +import java.util.List; + +public class Consulta { + private List documentos = new ArrayList(); + private String suggest; + private List autocomplete = new ArrayList(); + + /** + * @return the documentos + */ + public List getDocumentos() { + return documentos; + } + + /** + * @return the suggest + */ + public String getSuggest() { + return suggest; + } + + /** + * @return the autocomplete + */ + public List getAutocomplete() { + return autocomplete; + } + + /** + * @param documentos the documentos to set + */ + public void setDocumentos(List documentos) { + this.documentos = documentos; + } + + /** + * @param suggest the suggest to set + */ + public void setSuggest(String suggest) { + this.suggest = suggest; + } + + /** + * @param autocomplete the autocomplete to set + */ + public void setAutocomplete(List autocomplete) { + this.autocomplete = autocomplete; + } +} \ No newline at end of file diff --git a/src/main/java/com/manalejandro/arjion/services/MainService.java b/src/main/java/com/manalejandro/arjion/services/MainService.java index c28a140..f8c8a8f 100644 --- a/src/main/java/com/manalejandro/arjion/services/MainService.java +++ b/src/main/java/com/manalejandro/arjion/services/MainService.java @@ -2,8 +2,11 @@ package com.manalejandro.arjion.services; import java.util.List; +import com.manalejandro.arjion.model.Consulta; import com.manalejandro.arjion.model.Documento; +import org.springframework.data.domain.Pageable; + public interface MainService { public boolean save(Documento doc); @@ -13,4 +16,8 @@ public interface MainService { public List findAllDocumento(); public Documento findOne(String nombre); + + public Integer maxTamano(); + + public Consulta search(String busqueda, String[] tipo, Integer tamano, Pageable pageable); } diff --git a/src/main/java/com/manalejandro/arjion/services/MainServiceImpl.java b/src/main/java/com/manalejandro/arjion/services/MainServiceImpl.java index d7774ae..7c49b9e 100644 --- a/src/main/java/com/manalejandro/arjion/services/MainServiceImpl.java +++ b/src/main/java/com/manalejandro/arjion/services/MainServiceImpl.java @@ -1,22 +1,46 @@ package com.manalejandro.arjion.services; +import java.io.IOException; import java.util.ArrayList; import java.util.List; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.manalejandro.arjion.model.Consulta; import com.manalejandro.arjion.model.Documento; import com.manalejandro.arjion.repositories.MainRepository; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.Client; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.aggregations.AggregationBuilder; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry; +import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry.Option; +import org.elasticsearch.search.suggest.SuggestBuilder; +import org.elasticsearch.search.suggest.SuggestBuilders; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; @Service public class MainServiceImpl implements MainService { + private final ApplicationContext appContext; private final MainRepository mainRepository; + @Value("#{@indexName}") + private String index; + @Value("#{@documentType}") + private String document; + @Autowired - public MainServiceImpl(MainRepository mainRepository) { + public MainServiceImpl(MainRepository mainRepository, ApplicationContext appContext) { this.mainRepository = mainRepository; + this.appContext = appContext; } @Override @@ -48,4 +72,56 @@ public class MainServiceImpl implements MainService { public Documento findOne(String nombre) { return mainRepository.findById(nombre).get(); } + + @Override + public Integer maxTamano() { + return mainRepository.findAll(new Sort(Sort.Direction.DESC, "tamano")).iterator().next().getTamano(); + } + + @Override + public Consulta search(String busqueda, String[] tipo, Integer tamano, Pageable pageable) { + Client client = (Client) appContext.getBean("client"); + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + if (busqueda != null && !"null".equals(busqueda) && !busqueda.isEmpty()) { + boolQueryBuilder.must(QueryBuilders.matchQuery("nombre", busqueda)); + boolQueryBuilder.should(QueryBuilders.matchQuery("contenido", busqueda)); + } + if (tipo != null && tipo.length > 0) + boolQueryBuilder.filter(QueryBuilders.termsQuery("tipo", tipo)); + if (tamano != null && tamano >= 0) + boolQueryBuilder.must(QueryBuilders.rangeQuery("tamano").to(tamano).includeUpper(true)); + AggregationBuilder aggregation = AggregationBuilders.terms("by_xarchivo").field("x_archivo").size(10000); + SuggestBuilder suggest = new SuggestBuilder() + .addSuggestion("suggest", SuggestBuilders.completionSuggestion("nombre").text(busqueda).size(10)) + .addSuggestion("phrase", SuggestBuilders.phraseSuggestion("nombre").text(busqueda).size(1) + .realWordErrorLikelihood((float) 0.95).maxErrors((float) 0.5).gramSize(2)); + System.out.println(boolQueryBuilder); + SearchResponse response = client.prepareSearch(index).setQuery(boolQueryBuilder).addAggregation(aggregation) + .suggest(suggest).setSize(pageable.getPageSize()).setFrom(pageable.getPageNumber()).execute() + .actionGet(); + Consulta consulta = new Consulta(); + consulta.setSuggest(response.getSuggest().getSuggestion("phrase").getEntries().get(0).getOptions().size() > 0 + ? response.getSuggest().getSuggestion("phrase").getEntries().get(0).getOptions().get(0).getText() + .string() + : ""); + for (Entry entry : response.getSuggest().getSuggestion("suggest").getEntries()) { + entry.getOptions().forEach(option -> { + String suggestText = option.getText().string().trim(), + autocompleteClean = busqueda.replaceAll("[^\\p{Alnum}\\p{IsAlphabetic} ]", ""); + for (String item : autocompleteClean.split(" ")) { + if (item.length() > 0) { + consulta.getAutocomplete().add( + suggestText.replaceAll("(?i)((?!<)" + item + "(?![^<>]*>))", "$1")); + } + } + }); + } + ObjectMapper mapper = new ObjectMapper(); + try { + consulta.setDocumentos(mapper.readValue(response.getHits().getHits().toString(), List.class)); + } catch (IOException e) { + e.printStackTrace(); + } + return consulta; + } }