Example usage for org.apache.lucene.search BooleanQuery BooleanQuery

List of usage examples for org.apache.lucene.search BooleanQuery BooleanQuery

Introduction

In this page you can find the example usage for org.apache.lucene.search BooleanQuery BooleanQuery.

Prototype

BooleanQuery

Source Link

Usage

From source file:es.pode.indexador.negocio.servicios.busqueda.SrvBuscadorServiceImpl.java

License:Open Source License

/**
 * Este metodo busca los documentos indexados que cumplen estar dentro del rango de fechas dado y que tengan el valor de licencia dado.
 * /*  w w  w  .  j a v  a  2  s.  com*/
 * @param licencia Licencia de la que se quiere saber el numero de documentos que la contiene.
 * @param fechaDesde Fecha desde del periodo en el que se esta interesado.
 * @param fechaHasta Fecha hasta del periodo en el que se esta interesado.
 * @param idioma Idioma en el que se esta interesado buscar.
 * @return ResultadosCountVO VO que alberga el resultado de la solicitud de la suma de documentos que cumplen la condicion.
 */
protected ResultadosCountVO handleBusquedaDocsLicenciaFecha(String licencia, Calendar fechaDesde,
        Calendar fechaHasta, String idioma) throws Exception {
    if (licencia == null || licencia.equals("")) {
        logger.error("Error buscando documentos con licencias. Licencia vacia.");
        throw new Exception("Error buscando documentos con licencias. Licencia vacia.");
    }
    if (idioma == null || idioma.equals("")) {
        logger.error("Error buscando documentos con licencias. Idioma de busqueda vacio.");
        throw new Exception("Error buscando documentos con licencias. Idioma de busqueda vacio.");
    }
    if (fechaDesde == null || fechaHasta == null) {
        logger.error("Error buscando documentos con licencias. Fechas desde[" + fechaDesde == null ? null
                : fechaDesde.toString() + "] y hasta[" + fechaHasta == null ? null
                        : fechaHasta.toString() + "] vacias.");
        throw new Exception("Error buscando documentos con licencias. Fechas desde[" + fechaDesde == null ? null
                : fechaDesde.toString() + "] y hasta[" + fechaHasta == null ? null
                        : fechaHasta.toString() + "] vacias.");
    }
    if (fechaDesde.after(fechaHasta)) {
        logger.error("Error buscando documentos con licencias. Fechas desde[" + fechaDesde.toString()
                + "] y hasta[" + fechaHasta.toString() + "] incoherentes.");
        throw new Exception("Error buscando documentos con licencias. Fechas desde[" + fechaDesde.toString()
                + "] y hasta[" + fechaHasta.toString() + "] incoherentes.");
    }
    BooleanQuery andQuery = new BooleanQuery();
    //      Configuramos el valor de memoria.   
    andQuery.setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));
    Calendar antes = Calendar.getInstance();
    Calendar despues = Calendar.getInstance();
    antes.setTime(fechaDesde.getTime());
    despues.setTime(fechaHasta.getTime());
    String antesS = "" + antes.get(Calendar.YEAR) + formatMonthMM((antes.get(Calendar.MONTH) + 1))
            + formatDayDD(antes.get(Calendar.DAY_OF_MONTH));
    String despuesS = "" + despues.get(Calendar.YEAR) + formatMonthMM((despues.get(Calendar.MONTH) + 1))
            + formatDayDD(despues.get(Calendar.DAY_OF_MONTH));
    logger.debug(
            "Buscando documentos con licencia[" + licencia + "] desde[" + antesS + "] hasta[" + despuesS + "]");
    //aniadimos la query con el rango de fechas
    andQuery.add(getRangeQuery(props.getProperty(CAMPO_FECHA_PUBLICACION), antesS, despuesS),
            BooleanClause.Occur.MUST);
    //aniadimos la query con el id de la licencia
    //       QueryParser parser = new QueryParser(props.getProperty(CAMPO_LICENCIA), new StandardAnalyzer());
    //          // el standar analyzer utiliza el StandardTokenizer gracias al cual elimina de la licencia los caracteres extranios
    //          // para ver que caracteres tiene en cuenta al tokenizar:http://lucene.zones.apache.org:8080/hudson/job/Lucene-Nightly/javadoc/org/apache/lucene/analysis/standard/StandardTokenizer.html
    //      Query licenciaQuery = parser.parse("\""+licencia+"\""); //tenemos en cuenta el texto entre comillas para que el parseo no se pierda.
    //         // hemos convertido en tokens las palabras de la licencia
    //       andQuery.add(getPhraseQuery(props.getProperty(CAMPO_LICENCIA), Arrays.asList(licencia.split(" "))),BooleanClause.Occur.MUST);
    andQuery.add(getTermQuery(props.getProperty(CAMPO_LICENCIA), licencia), BooleanClause.Occur.MUST);
    //      andQuery.add(licenciaQuery,BooleanClause.Occur.MUST);

    //      Utilizamos el idioma seleccionado en la busqueda para buscar el indice sobre el que se ejecuta la query.
    Directory directorioIndiceSimple = this.getIndexByLanguage(idioma);
    if (directorioIndiceSimple == null) {
        logger.error("Error buscando documentos con licencias. Indice para idioma[" + idioma
                + "] no accesible. Imposible buscar.");
        throw new Exception("Error buscando documentos con licencias. Indice para idioma[" + idioma
                + "] no accesible. Imposible buscar.");
    }
    Hits hits;
    try {
        IndexSearcher searcher = new IndexSearcher(directorioIndiceSimple);
        searcher.setSimilarity(new DefaultSimilarity());
        hits = searcher.search(andQuery);
    } catch (Exception e) {
        logger.error("Error buscando documentos con licencias. Error buscando en indice[" + idioma
                + "] con query[" + andQuery.toString() + "].[" + e.getCause() + "]");
        throw new Exception("Error buscando documentos con licencias. Error buscando en indice[" + idioma
                + "] con query[" + andQuery.toString() + "].", e);
    }
    ResultadosCountVO resultado = new ResultadosCountVO();
    if (hits != null)
        resultado.setDocumentosCount(new Integer(hits.length()));
    else
        resultado.setDocumentosCount(new Integer(0));
    return resultado;
}

From source file:es.pode.indexador.negocio.servicios.busqueda.SrvBuscadorServiceImpl.java

License:Open Source License

/**
 * Este metodo busca los documentos que tienen fecha entre las fechas desde y hasta dados y que tengan el campo de arbol curricular
 *  nodo coincidente con el identificador de nodo que le pasan. 
 * Esto devuelve el numero de documentos indexados que estan catalogados exactamente en ese nodo de arbol curricular.
 * @param idNodo Identificador del nodo de arbol curricular del que se quiere averiguar el numero de documentos que tiene asociados.
 * @param fechaDesde Fecha desde del periodo en el que se esta interesado.
 * @param fechaHasta Fecha hasta del periodo en el que se esta interesado.
 * @param idioma Idioma en el que se esta interesado buscar.
 * @return ResultadosCountVO VO que alberga el resultado de la solicitud de la suma de documentos que cumplen la condicion.
 *//*from   w w  w  .j a va2 s .  com*/
protected ResultadosCountVO handleBusquedaDocsNodoFechaArbolCurricular(String idNodo, Calendar fechaDesde,
        Calendar fechaHasta, String idioma) throws Exception {
    if (idNodo == null || idNodo.equals("")) {
        logger.error("Error buscando nodo de arbol curricular. Nodo vacio.");
        throw new Exception("Error buscando nodo de arbol curricular. Nodo vacio.");
    }
    if (idioma == null || idioma.equals("")) {
        logger.error("Error buscando nodo de arbol curricular. Idioma de busqueda vacio.");
        throw new Exception("Error buscando nodo de arbol curricular. Idioma de busqueda vacio.");
    }
    if (fechaDesde == null || fechaHasta == null) {
        logger.error("Error buscando nodo de arbol curricular. Fechas desde[" + fechaDesde == null ? null
                : fechaDesde.toString() + "] y hasta[" + fechaHasta == null ? null
                        : fechaHasta.toString() + "] vacias.");
        throw new Exception("Error buscando nodo de arbol curricular. Fechas desde[" + fechaDesde == null ? null
                : fechaDesde.toString() + "] y hasta[" + fechaHasta == null ? null
                        : fechaHasta.toString() + "] vacias.");
    }
    if (fechaDesde.after(fechaHasta)) {
        logger.error("Error buscando nodo de arbol curricular. Fechas desde[" + fechaDesde.toString()
                + "] y hasta[" + fechaHasta.toString() + "] incoherentes.");
        throw new Exception("Error buscando nodo de arbol curricular. Fechas desde[" + fechaDesde.toString()
                + "] y hasta[" + fechaHasta.toString() + "] incoherentes.");
    }
    BooleanQuery andQuery = new BooleanQuery();
    //      Configuramos el valor de memoria.   
    andQuery.setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));
    Calendar antes = Calendar.getInstance();
    Calendar despues = Calendar.getInstance();
    antes.setTime(fechaDesde.getTime());
    despues.setTime(fechaHasta.getTime());
    String antesS = "" + antes.get(Calendar.YEAR) + formatMonthMM((antes.get(Calendar.MONTH) + 1))
            + formatDayDD(antes.get(Calendar.DAY_OF_MONTH));
    String despuesS = "" + despues.get(Calendar.YEAR) + formatMonthMM((despues.get(Calendar.MONTH) + 1))
            + formatDayDD(despues.get(Calendar.DAY_OF_MONTH));
    logger.debug(
            "Buscando nodo de arbol curricular[" + idNodo + "] desde[" + antesS + "] hasta[" + despuesS + "]");
    //aniadimos la query con el rango de fechas
    andQuery.add(getRangeQuery(props.getProperty(CAMPO_FECHA_PUBLICACION), antesS, despuesS),
            BooleanClause.Occur.MUST);
    //aniadimos la query con el id del nodo
    andQuery.add(getTermQuery(props.getProperty(CAMPO_AREA_CURRICULAR_NODO), idNodo), BooleanClause.Occur.MUST);

    //      Utilizamos el idioma seleccionado en la busqueda para buscar el indice sobre el que se ejecuta la query.
    Directory directorioIndiceSimple = this.getIndexByLanguage(idioma);
    if (directorioIndiceSimple == null) {
        logger.error("Error buscando nodo de arbol curricular. Indice para idioma[" + idioma
                + "] no accesible. Imposible buscar.");
        throw new Exception("Error buscando nodo de arbol curricular. Indice para idioma[" + idioma
                + "] no accesible. Imposible buscar.");
    }
    Hits hits;
    try {
        IndexSearcher searcher = new IndexSearcher(directorioIndiceSimple);
        searcher.setSimilarity(new DefaultSimilarity());
        hits = searcher.search(andQuery);
    } catch (Exception e) {
        logger.error("Error buscando nodo de arbol curricular. Error buscando en indice[" + idioma
                + "] con query[" + andQuery.toString() + "].[" + e.getCause() + "]");
        throw new Exception("Error buscando nodo de arbol curricular. Error buscando en indice[" + idioma
                + "] con query[" + andQuery.toString() + "].", e);
    }
    ResultadosCountVO resultado = new ResultadosCountVO();
    if (hits != null)
        resultado.setDocumentosCount(new Integer(hits.length()));
    else
        resultado.setDocumentosCount(new Integer(0));
    return resultado;
}

From source file:es.pode.indexador.negocio.servicios.busqueda.SrvBuscadorServiceImpl.java

License:Open Source License

/**
 * Este metodo busca los documentos indexados que cumplan estar en el rango de valoraciones que le pasan dentro de las fechas desde y hasta.
 * @param nivelAgregacion Valor de valoracion.
 * @param fechaDesde Fecha desde del periodo en el que se esta interesado.
 * @param fechaHasta Fecha hasta del periodo en el que se esta interesado.
 * @param idioma Idioma en el que se esta interesado buscar.
 * @return ResultadosCountVO VO que alberga el resultado de la solicitud de la suma de documentos que cumplen la condicion.
 *//*from w w w  .ja  v  a2 s. c om*/
protected ResultadosCountVO handleBusquedaDocsRangoFechaNivelAgregacion(String nivelAgregacion,
        Calendar fechaDesde, Calendar fechaHasta, String idioma) throws Exception {
    if (nivelAgregacion == null || nivelAgregacion.equals("")) {
        logger.error("Error buscando documentos con rango de valoracion. Nivel de agregacion vacio.");
        throw new Exception("Error buscando documentos con rango de valoracion. Nivel de agregacion vacio.");
    }
    if (idioma == null || idioma.equals("")) {
        logger.error("Error buscando documentos con rango de valoracion. Idioma de busqueda vacio.");
        throw new Exception("Error buscando documentos con rango de valoracion. Idioma de busqueda vacio.");
    }
    if (fechaDesde == null || fechaHasta == null) {
        logger.error(
                "Error buscando documentos con rango de valoracion. Fechas desde[" + fechaDesde == null ? null
                        : fechaDesde.toString() + "] y hasta[" + fechaHasta == null ? null
                                : fechaHasta.toString() + "] vacias.");
        throw new Exception(
                "Error buscando documentos con rango de valoracion. Fechas desde[" + fechaDesde == null ? null
                        : fechaDesde.toString() + "] y hasta[" + fechaHasta == null ? null
                                : fechaHasta.toString() + "] vacias.");
    }
    if (fechaDesde.after(fechaHasta)) {
        logger.error("Error buscando documentos con rango de valoracion. Fechas desde[" + fechaDesde.toString()
                + "] y hasta[" + fechaHasta.toString() + "] incoherentes.");
        throw new Exception("Error buscando documentos con rango de valoracion. Fechas desde["
                + fechaDesde.toString() + "] y hasta[" + fechaHasta.toString() + "] incoherentes.");
    }
    BooleanQuery andQuery = new BooleanQuery();
    //      Configuramos el valor de memoria.   
    andQuery.setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));
    Calendar antes = Calendar.getInstance();
    Calendar despues = Calendar.getInstance();
    antes.setTime(fechaDesde.getTime());
    despues.setTime(fechaHasta.getTime());
    String antesS = "" + antes.get(Calendar.YEAR) + formatMonthMM((antes.get(Calendar.MONTH) + 1))
            + formatDayDD(antes.get(Calendar.DAY_OF_MONTH));
    String despuesS = "" + despues.get(Calendar.YEAR) + formatMonthMM((despues.get(Calendar.MONTH) + 1))
            + formatDayDD(despues.get(Calendar.DAY_OF_MONTH));
    logger.debug("Buscando documentos con nivel de agregacion[" + nivelAgregacion + "] desde[" + antesS
            + "] hasta[" + despuesS + "]");
    //aniadimos la query con el rango de fechas
    andQuery.add(getRangeQuery(props.getProperty(CAMPO_FECHA_PUBLICACION), antesS, despuesS),
            BooleanClause.Occur.MUST);
    //aniadimos la query con la valoracion
    andQuery.add(getTermQuery(props.getProperty(CAMPO_NIVEL_AGREGACION), nivelAgregacion),
            BooleanClause.Occur.MUST);

    //      Utilizamos el idioma seleccionado en la busqueda para buscar el indice sobre el que se ejecuta la query.
    Directory directorioIndiceSimple = this.getIndexByLanguage(idioma);
    if (directorioIndiceSimple == null) {
        logger.error("Error buscando documentos con rango de valoracion. Indice para idioma[" + idioma
                + "] no accesible. Imposible buscar.");
        throw new Exception("Error buscando documentos con rango de valoracion. Indice para idioma[" + idioma
                + "] no accesible. Imposible buscar.");
    }
    Hits hits;
    try {
        IndexSearcher searcher = new IndexSearcher(directorioIndiceSimple);
        searcher.setSimilarity(new DefaultSimilarity());
        hits = searcher.search(andQuery);
    } catch (Exception e) {
        logger.error("Error buscando documentos con rango de valoracion. Error buscando en indice[" + idioma
                + "] con query[" + andQuery.toString() + "].[" + e.getCause() + "]");
        throw new Exception("Error buscando documentos con rango de valoracion. Error buscando en indice["
                + idioma + "] con query[" + andQuery.toString() + "].", e);
    }
    ResultadosCountVO resultado = new ResultadosCountVO();
    if (hits != null)
        resultado.setDocumentosCount(new Integer(hits.length()));
    else
        resultado.setDocumentosCount(new Integer(0));
    return resultado;
}

From source file:es.pode.indexador.negocio.servicios.busqueda.SrvBuscadorServiceImpl.java

License:Open Source License

/**
* Este metodo busca los ODEs indexados en todos los indices que cumplan las condiciones de busqueda que le pasan como parametro.
* Las fechas desde y hasta se interpretan inclusives y en el caso de no estar presentes, sin limite superior o inferior.
* @param paramBusq Parametros de busqueda.
* @return ResultadoHeaderVO[] Array de VO's que albergan los resulados de la consulta en un contenedor de Headers.
*//*  www . j a v a  2  s .  co  m*/
protected es.pode.indexador.negocio.servicios.busqueda.ResultadoHeaderVO[] handleBusquedaHeadersRepositorio(
        ParamPeriodoRepositorioVO paramBusq) throws Exception {

    if (paramBusq == null) {
        logger.error("Error obteniendo las cabeceras del repositorio. No hay parametros de busqueda.");
        throw new Exception("Error obteniendo las cabeceras del repositorio. No hay parametros de busqueda.");
    }
    Date fechaDesde = (paramBusq.getDesde() != null ? paramBusq.getDesde().getTime() : null);
    Date fechaHasta = (paramBusq.getHasta() != null ? paramBusq.getHasta().getTime() : null);
    if (fechaDesde != null && fechaHasta != null && fechaDesde.after(fechaHasta)) {
        logger.error("Error obteniendo las cabeceras del repositorio. Fechas desde[" + fechaDesde.toString()
                + "] y hasta[" + fechaHasta.toString() + "] incoherentes.");
        throw new Exception("Error obteniendo las cabeceras del repositorio. Fechas desde["
                + fechaDesde.toString() + "] y hasta[" + fechaHasta.toString() + "] incoherentes.");
    }
    //      Obtenemos todos los indices sobre los que hay objetos
    IndiceVO[] indices = new IndiceVO[0];
    try {
        indices = handleObtenerIdiomasBusqueda();
    } catch (Exception e) {
        logger.error("Error obteniendo las cabeceras del repositorio. Imposible recuperar los indices.["
                + e.getMessage() + "]");
        throw new Exception("Error obteniendo las cabeceras del repositorio. Imposible recuperar los indices.",
                e);
    }
    //     Para cada indice, tenemos que hacer un recorrido de todos los nodos del arbol y sumar el acumulado.
    if (indices == null || indices.length == 0) {
        logger.error(
                "Error obteniendo las cabeceras del repositorio. No existen indices en el indexador. Imposible continuar.");
        throw new Exception(
                "Error obteniendo las cabeceras del repositorio. No existen indices en el indexador. Imposible continuar.");
    }

    //       Configuramos la query que se va a realizar sobre el indice
    BooleanQuery andQuery = new BooleanQuery();
    //      Configuramos el valor de memoria.   
    andQuery.setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));
    //       Configuramos la fecha desde
    String antesS = null;
    String despuesS = null;
    if (fechaDesde != null) {
        Calendar antes = Calendar.getInstance();
        antes.setTime(fechaDesde);
        antesS = "" + antes.get(Calendar.YEAR) + formatMonthMM((antes.get(Calendar.MONTH) + 1))
                + formatDayDD(antes.get(Calendar.DAY_OF_MONTH));
    }
    //       Configuramos la fecha hasta
    if (fechaHasta != null) {
        Calendar despues = Calendar.getInstance();
        despues.setTime(fechaHasta);
        despuesS = "" + despues.get(Calendar.YEAR) + formatMonthMM((despues.get(Calendar.MONTH) + 1))
                + formatDayDD(despues.get(Calendar.DAY_OF_MONTH));
    }
    logger.debug("Buscando headers en repositorio desde[" + antesS + "] hasta[" + despuesS + "]");
    //aniadimos la query con el rango de fechas
    andQuery.add(getConstantScoreRangeQuery(props.getProperty(CAMPO_FECHA_PUBLICACION), antesS, despuesS),
            BooleanClause.Occur.MUST);

    //      Nos recorremos todos los indices realizando la misma consulta y recopilando la informacion que saquemos de cada indice
    ArrayList resultados = new ArrayList();
    for (int i = 0; i < indices.length; i++) {
        Directory directorioIndiceSimple = this.getIndexByLanguage(indices[i].getIdentificador());
        if (directorioIndiceSimple == null) {
            logger.error("Error obteniendo las cabeceras del repositorio. Indice para idioma["
                    + indices[i].getIdentificador() + "] no accesible. Imposible buscar.");
            throw new Exception("Error obteniendo las cabeceras del repositorio. Indice para idioma["
                    + indices[i].getIdentificador() + "] no accesible. Imposible buscar.");
        }
        Hits hits;
        try {
            IndexSearcher searcher = new IndexSearcher(directorioIndiceSimple);
            searcher.setSimilarity(new DefaultSimilarity());
            hits = searcher.search(andQuery);
            //             Ahora llamamos a la busqueda en repositorio pero aplicando un filtro de licencia
            //             hits = searcher.search(andQuery, crearFiltroLicencia());
        } catch (Exception e) {
            logger.error("Error obteniendo las cabeceras del repositorio. Error buscando en indice["
                    + indices[i].getIdentificador() + "] con query[" + andQuery.toString() + "].["
                    + e.getCause() + "]");
            throw new Exception("Error obteniendo las cabeceras del repositorio. Error buscando en indice["
                    + indices[i].getIdentificador() + "] con query[" + andQuery.toString() + "].", e);
        }
        if (hits != null && hits.length() > 0) {
            try {
                resultados.addAll(Arrays.asList(mapDocToHeader(hits)));
            } catch (RuntimeException e) {
                logger.error(
                        "Error obteniendo las cabeceras del repositorio. Error mapeando resultados para indice["
                                + indices[i].getIdentificador() + "] con query[" + andQuery.toString() + "].["
                                + e.getCause() + "]");
                throw new Exception(
                        "Error obteniendo las cabeceras del repositorio. Error mapeando resultados para indice["
                                + indices[i].getIdentificador() + "] con query[" + andQuery.toString() + "].",
                        e);
            }
        }
    }
    return (ResultadoHeaderVO[]) resultados.toArray(new ResultadoHeaderVO[0]);
}

From source file:es.pode.indexador.negocio.servicios.busqueda.SrvBuscadorServiceImpl.java

License:Open Source License

/**
* Metodo que ejecuta una busqueda en todo el repositorio con los parametros de busqueda que le pasan.
* Las fechas desde y hasta se interpretan inclusives y en el caso de no estar presentes, sin limite superior o inferior.
* @param paramBusq Parametros de busqueda.
* @return ResultadoRecordVO[] Array de VO's que albergan los resulados de la consulta en un contenedor de Records.
*///from   w w w. jav  a  2 s.  co m
protected es.pode.indexador.negocio.servicios.busqueda.ResultadoRecordVO[] handleBusquedaRepositorio(
        ParamPeriodoRepositorioVO paramBusq) throws Exception {
    if (paramBusq == null) {
        logger.error("Error obteniendo los registros del repositorio. No hay parametros de busqueda.");
        throw new Exception("Error obteniendo los registros del repositorio. No hay parametros de busqueda.");
    }
    Date fechaDesde = (paramBusq.getDesde() != null ? paramBusq.getDesde().getTime() : null);
    Date fechaHasta = (paramBusq.getHasta() != null ? paramBusq.getHasta().getTime() : null);
    if (fechaDesde != null && fechaHasta != null && fechaDesde.after(fechaHasta)) {
        logger.error("Error obteniendo los registros del repositorio. Fechas desde[" + fechaDesde.toString()
                + "] y hasta[" + fechaHasta.toString() + "] incoherentes.");
        throw new Exception("Error obteniendo los registros del repositorio. Fechas desde["
                + fechaDesde.toString() + "] y hasta[" + fechaHasta.toString() + "] incoherentes.");
    }
    //      Obtenemos todos los indices sobre los que hay objetos
    IndiceVO[] indices = new IndiceVO[0];
    try {
        indices = handleObtenerIdiomasBusqueda();
    } catch (Exception e) {
        logger.error("Error obteniendo los registros del repositorio. Imposible recuperar los indices.["
                + e.getMessage() + "]");
        throw new Exception("Error obteniendo los registros del repositorio. Imposible recuperar los indices.",
                e);
    }
    //     Para cada indice, tenemos que hacer un recorrido de todos los nodos del arbol y sumar el acumulado.
    if (indices == null || indices.length == 0) {
        logger.error(
                "Error obteniendo los registros del repositorio. No existen indices en el indexador. Imposible continuar.");
        throw new Exception(
                "Error obteniendo los registros del repositorio. No existen indices en el indexador. Imposible continuar.");
    }

    //       Configuramos la query que se va a realizar sobre el indice
    BooleanQuery andQuery = new BooleanQuery();
    //      Configuramos el valor de memoria.   
    andQuery.setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));
    //       Configuramos la fecha desde
    String antesS = null;
    String despuesS = null;
    if (fechaDesde != null) {
        Calendar antes = Calendar.getInstance();
        antes.setTime(fechaDesde);
        antesS = "" + antes.get(Calendar.YEAR) + formatMonthMM((antes.get(Calendar.MONTH) + 1))
                + formatDayDD(antes.get(Calendar.DAY_OF_MONTH));
    }
    //       Configuramos la fecha hasta
    if (fechaHasta != null) {
        Calendar despues = Calendar.getInstance();
        despues.setTime(fechaHasta);
        despuesS = "" + despues.get(Calendar.YEAR) + formatMonthMM((despues.get(Calendar.MONTH) + 1))
                + formatDayDD(despues.get(Calendar.DAY_OF_MONTH));
    }
    logger.debug("Buscando registros en repositorio desde[" + antesS + "] hasta[" + despuesS + "]");
    //aniadimos la query con el rango de fechas
    andQuery.add(getConstantScoreRangeQuery(props.getProperty(CAMPO_FECHA_PUBLICACION), antesS, despuesS),
            BooleanClause.Occur.MUST);

    //      Nos recorremos todos los indices realizando la misma consulta y recopilando la informacion que saquemos de cada indice
    ArrayList resultados = new ArrayList();
    for (int i = 0; i < indices.length; i++) {
        Directory directorioIndiceSimple = this.getIndexByLanguage(indices[i].getIdentificador());
        if (directorioIndiceSimple == null) {
            logger.error("Error obteniendo los registros del repositorio. Indice para idioma["
                    + indices[i].getIdentificador() + "] no accesible. Imposible buscar.");
            throw new Exception("Error obteniendo los registros del repositorio. Indice para idioma["
                    + indices[i].getIdentificador() + "] no accesible. Imposible buscar.");
        }
        Hits hits;
        try {
            IndexSearcher searcher = new IndexSearcher(directorioIndiceSimple);
            searcher.setSimilarity(new DefaultSimilarity());
            hits = searcher.search(andQuery);
            //             Ahora llamamos a la busqueda en repositorio pero aplicando un filtro de licencia
            //             hits = searcher.search(andQuery, crearFiltroLicencia());
        } catch (Exception e) {
            logger.error("Error obteniendo los registros del repositorio. Error buscando en indice["
                    + indices[i].getIdentificador() + "] con query[" + andQuery.toString() + "].["
                    + e.getCause() + "]");
            throw new Exception("Error obteniendo los registros del repositorio. Error buscando en indice["
                    + indices[i].getIdentificador() + "] con query[" + andQuery.toString() + "].", e);
        }
        if (hits != null && hits.length() > 0) {
            try {
                resultados.addAll(Arrays.asList(mapDocToRecord(hits)));
            } catch (RuntimeException e) {
                logger.error(
                        "Error obteniendo los registros del repositorio. Error mapeando resultados para indice["
                                + indices[i].getIdentificador() + "] con query[" + andQuery.toString() + "].["
                                + e.getCause() + "]");
                throw new Exception(
                        "Error obteniendo los registros del repositorio. Error mapeando resultados para indice["
                                + indices[i].getIdentificador() + "] con query[" + andQuery.toString() + "].",
                        e);
            }
        }
    }
    return (ResultadoRecordVO[]) resultados.toArray(new ResultadoRecordVO[resultados.size()]);
}

From source file:es.pode.indexador.negocio.servicios.busqueda.SrvBuscadorServiceImpl.java

License:Open Source License

/**
* Este metodo devuelve todos los ODEs indexados en el repositorio para todos los idiomas.
* @return ResultadoRepositorioVO[] Array de VO's que albergan los resulados del repositorio.
*//*from   w w w . j  av  a2 s. c om*/
protected ResultadoRepositorioVO[] handleObtenerRepositorio() throws Exception {

    Date fechaDesde = handleFechaInicioRepositorio().getTime();
    Date fechaHasta = Calendar.getInstance().getTime(); // la fecha de hoy como hasta

    //      Obtenemos todos los indices sobre los que hay objetos
    IndiceVO[] indices = new IndiceVO[0];
    try {
        indices = handleObtenerIdiomasBusqueda();
    } catch (Exception e) {
        logger.error("Error recuperando repositorio. Imposible recuperar los indices.[" + e.getMessage() + "]");
        throw new Exception("Error recuperando repositorio. Imposible recuperar los indices.", e);
    }
    //     Para cada indice, tenemos que recoger todos los odes.
    if (indices == null || indices.length == 0) {
        logger.error("Error recuperando repositorio. No existen indices en el indexador. Imposible continuar.");
        throw new Exception(
                "Error recuperando repositorio. No existen indices en el indexador. Imposible continuar.");
    }

    //       Configuramos la query que se va a realizar sobre el indice
    BooleanQuery andQuery = new BooleanQuery();
    //      Configuramos el valor de memoria.   
    andQuery.setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));
    //       Configuramos la fecha desde
    String antesS = null;
    String despuesS = null;
    if (fechaDesde != null) {
        Calendar antes = Calendar.getInstance();
        antes.setTime(fechaDesde);
        antesS = "" + antes.get(Calendar.YEAR) + formatMonthMM((antes.get(Calendar.MONTH) + 1))
                + formatDayDD(antes.get(Calendar.DAY_OF_MONTH));
    }
    //       Configuramos la fecha hasta
    if (fechaHasta != null) {
        Calendar despues = Calendar.getInstance();
        despues.setTime(fechaHasta);
        despuesS = "" + despues.get(Calendar.YEAR) + formatMonthMM((despues.get(Calendar.MONTH) + 1))
                + formatDayDD(despues.get(Calendar.DAY_OF_MONTH));
    }
    logger.debug("Recuperando repositorio desde[" + antesS + "] hasta[" + despuesS + "]");
    //aniadimos la query con el rango de fechas
    andQuery.add(getConstantScoreRangeQuery(props.getProperty(CAMPO_FECHA_PUBLICACION), antesS, despuesS),
            BooleanClause.Occur.MUST);

    //      Nos recorremos todos los indices realizando la misma consulta y recopilando la informacion que saquemos de cada indice
    ArrayList resultados = new ArrayList();
    for (int i = 0; i < indices.length; i++) {
        Directory directorioIndiceSimple = this.getIndexByLanguage(indices[i].getIdentificador());
        if (directorioIndiceSimple == null) {
            logger.error("Error recuperando repositorio. Indice para idioma[" + indices[i].getIdentificador()
                    + "] no accesible. Imposible buscar.");
            throw new Exception("Error recuperando repositorio. Indice para idioma["
                    + indices[i].getIdentificador() + "] no accesible. Imposible buscar.");
        }
        Hits hits = null;
        try {
            IndexSearcher searcher = new IndexSearcher(directorioIndiceSimple);
            searcher.setSimilarity(new DefaultSimilarity());
            hits = searcher.search(andQuery);
            //             Dejamos de aplicar el filtro de licencia. Nos interesan todos los ODEs del repositorio
            //             hits = searcher.search(andQuery, crearFiltroLicencia());
        } catch (Exception e) {
            logger.error(
                    "Error recuperando repositorio. Error buscando en indice[" + indices[i].getIdentificador()
                            + "] con query[" + andQuery.toString() + "].[" + e.getCause() + "]");
            //             En el caso de que el indice de error, miro por el resto.
            //             throw new Exception("Error recuperando repositorio. Error buscando en indice["+indices[i].getIdentificador()+"] con query["+andQuery.toString()+"].",e);
        }
        if (hits != null && hits.length() > 0) {
            logger.info("Recuperando repositorio. Informacion de repositorio disponible para idioma["
                    + indices[i].getIdentificador() + "] fechas[" + antesS + "-" + despuesS + "] query["
                    + andQuery.toString() + "] documentos[" + hits.length() + "]");
            try {
                resultados.addAll(Arrays.asList(mapDocToRepositorio(hits)));
            } catch (RuntimeException e) {
                logger.error("Error recuperando repositorio. Error mapeando resultados para indice["
                        + indices[i].getIdentificador() + "] con query[" + andQuery.toString() + "].["
                        + e.getCause() + "]");
                throw new Exception(
                        "Error recuperando repositorio. Error mapeando resultados para indice["
                                + indices[i].getIdentificador() + "] con query[" + andQuery.toString() + "].",
                        e);
            }
        } else {
            logger.info("Recuperando repositorio. No hay informacion de repositorio disponible para idioma["
                    + indices[i].getIdentificador() + "] fechas[" + antesS + "-" + despuesS + "] query["
                    + andQuery.toString() + "]");
        }
    }
    return (ResultadoRepositorioVO[]) resultados.toArray(new ResultadoRepositorioVO[resultados.size()]);
}

From source file:es.pode.indexador.negocio.servicios.busqueda.SrvBuscadorServiceImpl.java

License:Open Source License

private Hits internaBusquedaAvanzada(es.pode.indexador.negocio.servicios.busqueda.ParamAvanzadoVO paramBusq,
        DisjunctionMaxQuery query) throws Exception {
    Directory directorioIndiceSimple = null;
    IndexSearcher searcher = null;// w ww . j  a  v  a  2 s. c o  m
    Hits hits = null;
    //      Utilizamos el idioma seleccionado en la busqueda para buscar el indice sobre el que se ejecuta la query.
    try {
        //      Utilizamos el idioma seleccionado en la busqueda para buscar el indice sobre el que se ejecuta la query.
        directorioIndiceSimple = this.getIndexByLanguage(paramBusq.getIdiomaBusqueda());
        searcher = new IndexSearcher(directorioIndiceSimple);
        BooleanQuery andQuery = new BooleanQuery();
        //      Las palabras clave (texto libre que se pone en la cabecera de la pantalla de busqueda) sirve para buscar
        //      sobre los campos titulo, descripcion y keywords
        //      Configuramos el valor de memoria.      
        andQuery.setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));
        //      Separamos las posibles frases de las palabras sueltas
        if (paramBusq.getPalabrasClave() != null && !paramBusq.getPalabrasClave().trim().equals("")) {
            List palabras = devolverFrases(paramBusq.getPalabrasClave().trim(), paramBusq.getIdiomaBusqueda());
            List ands = devolverAnds(palabras);
            String[] claves = props.getProperty(CAMPOS_CLAVE_AVANZADA).split(SEPARADOR_CLAVES);
            if (ands != null) {
                BooleanQuery andQueryClavePrincipal = new BooleanQuery();
                andQueryClavePrincipal.setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));
                List andsList = (List) ands.get(0);
                List orList = (List) ands.get(1);

                // Two lists ... one with words with a + before andList
                //               second one with rest of tokens (common words)   orList
                BooleanQuery andQueryClave = new BooleanQuery();
                andQueryClave.setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));
                for (int k = 0; k < claves.length; k++) {
                    for (int j = 0; j < andsList.size(); j++) {
                        BooleanQuery andQueryClaveInterna = new BooleanQuery();
                        andQueryClaveInterna
                                .setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));
                        for (int i = 0; i < ((List) andsList.get(j)).size(); i++) {
                            andQueryClaveInterna.add((List.class.isInstance(((List) andsList.get(j)).get(i)))
                                    ? getQuery(((List) andsList.get(j)).get(i), claves[k],
                                            CAMPOS_PHRASE_AVANZADA)
                                    : getQuery(((List) andsList.get(j)).get(i).toString(), claves[k],
                                            CAMPOS_WILDCARD_AVANZADA),
                                    BooleanClause.Occur.MUST);
                        }
                        andQueryClave.add(andQueryClaveInterna, BooleanClause.Occur.MUST);
                    }
                } //until here it treats words in the query with + before
                  // and now is the treatment for orList
                for (int j = 0; j < orList.size(); j++) {
                    BooleanQuery andQueryClaveInterna = new BooleanQuery();
                    andQueryClaveInterna
                            .setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));
                    for (int k = 0; k < claves.length; k++) {
                        //andQueryClaveInterna.add((List.class.isInstance(orList.get(j)))?getQuery(orList.get(j),claves[k],CAMPOS_PHRASE_AVANZADA):getQuery(orList.get(j).toString(),claves[k],CAMPOS_WILDCARD_AVANZADA),BooleanClause.Occur.SHOULD);

                        Query q1 = null;
                        if (List.class.isInstance(orList.get(j))) {
                            logger.debug(
                                    "* CAMPOS_PHRASE_AVANZADA   j=" + j + "  orList.get(j))=" + orList.get(j));
                            q1 = getQuery(orList.get(j), claves[k], CAMPOS_PHRASE_AVANZADA);
                        } else {
                            logger.debug(
                                    "* CAMPOS_WILDCARD_AVANZADA j=" + j + "  orList.get(j))=" + orList.get(j));
                            q1 = getQuery(orList.get(j).toString(), claves[k], CAMPOS_WILDCARD_AVANZADA);
                        }

                        andQueryClaveInterna.add(q1, BooleanClause.Occur.SHOULD);

                    }
                    andQueryClave.add(andQueryClaveInterna, BooleanClause.Occur.MUST);//original MUST
                }
                // Add the filter TermQueries as clauses
                addFiltersToQuery(paramBusq.getSearchFilters(), andQueryClave);

                andQuery.add(andQueryClave, BooleanClause.Occur.MUST);
                query.add(andQuery);
            }
        }
        //      Ahora recorremos todos los parametros de la busqueda avanzada, introduciendo los valores de busqueda
        //      en la query de aquellos campos que esten presentes en los parametros de la consulta.
        PropertyDescriptor[] beanPDs = Introspector.getBeanInfo(paramBusq.getClass()).getPropertyDescriptors();
        for (int j = 0; j < beanPDs.length; j++) {
            if (props.getProperty(PREFIJO_CAMPO + beanPDs[j].getName()) != null
                    && (getAndOrAccess(beanPDs[j].getName(), true)
                            || getAndOrAccess(beanPDs[j].getName(), false))) {
                if (beanPDs[j].getReadMethod().invoke(paramBusq, new Object[0]) != null && !beanPDs[j]
                        .getReadMethod().invoke(paramBusq, new Object[0]).toString().trim().equals("")) {
                    //               Comprobar analyse para no tener un tratamiento especial para formato

                    List palabras = new ArrayList();
                    if (getRangeQueryAccess(props.getProperty(CAMPOS_RANGE_AVANZADA).split(SEPARADOR_CLAVES),
                            PREFIJO_CAMPO + beanPDs[j].getName())
                            || esTextoLibre(props.getProperty(CAMPOS_TEXTO_LIBRE).split(SEPARADOR_CLAVES),
                                    PREFIJO_CAMPO + beanPDs[j].getName()))
                        palabras = devolverFrases(
                                beanPDs[j].getReadMethod().invoke(paramBusq, new Object[0]).toString().trim(),
                                paramBusq.getIdiomaBusqueda());
                    else
                        palabras.add(
                                beanPDs[j].getReadMethod().invoke(paramBusq, new Object[0]).toString().trim());
                    if (getRangeQueryAccess(props.getProperty(CAMPOS_RANGE_AVANZADA).split(SEPARADOR_CLAVES),
                            PREFIJO_CAMPO + beanPDs[j].getName()))
                        andQuery.add(
                                getRangeQuery(props.getProperty(PREFIJO_CAMPO + beanPDs[j].getName()),
                                        palabras.get(0).toString(), palabras.get(1).toString()),
                                BooleanClause.Occur.MUST);
                    else {
                        List ands = devolverAnds(palabras);
                        List andsList = (List) ands.get(0);
                        List orList = (List) ands.get(1);
                        BooleanQuery andQueryClave = new BooleanQuery();
                        andQueryClave.setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));
                        for (int k = 0; k < andsList.size(); k++) {
                            BooleanQuery andQueryClaveInterna = new BooleanQuery();
                            andQueryClaveInterna
                                    .setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));
                            for (int i = 0; i < ((List) andsList.get(k)).size(); i++) {
                                andQueryClaveInterna
                                        .add((List.class.isInstance(((List) andsList.get(k)).get(i)))
                                                ? getQuery(((List) andsList.get(k)).get(i),
                                                        PREFIJO_CAMPO + beanPDs[j].getName(),
                                                        CAMPOS_PHRASE_AVANZADA)
                                                : getQuery(((List) andsList.get(k)).get(i).toString(),
                                                        PREFIJO_CAMPO + beanPDs[j].getName(),
                                                        CAMPOS_WILDCARD_AVANZADA),
                                                BooleanClause.Occur.MUST);
                            }
                            andQueryClave.add(andQueryClaveInterna, BooleanClause.Occur.SHOULD);
                        }
                        for (int k = 0; k < orList.size(); k++) {
                            andQueryClave.add((List.class.isInstance(orList.get(k)))
                                    ? getQuery(orList.get(k), PREFIJO_CAMPO + beanPDs[j].getName(),
                                            CAMPOS_PHRASE_AVANZADA)
                                    : getQuery(orList.get(k).toString(), PREFIJO_CAMPO + beanPDs[j].getName(),
                                            CAMPOS_WILDCARD_AVANZADA),
                                    BooleanClause.Occur.SHOULD);
                        }
                        if (getAndOrAccess(beanPDs[j].getName(), true))
                            andQuery.add(andQueryClave, BooleanClause.Occur.MUST);
                        else if (getAndOrAccess(beanPDs[j].getName(), false))
                            andQuery.add(andQueryClave, BooleanClause.Occur.SHOULD);
                    }
                }
            }
        }
        if (logger.isDebugEnabled())
            logger.debug("Consulta interna simple con query[" + query.toString() + "]");

        Sort sortMethod = chooseSorter(paramBusq);
        logger.debug("About to do the search. It will be sorted with :" + sortMethod.toString());
        hits = searcher.search(andQuery, sortMethod);

        Iterator it = hits.iterator();
        int i = 1;
        logger.debug("* Lucene results");
        while (it.hasNext()) {
            org.apache.lucene.search.Hit hit = (org.apache.lucene.search.Hit) it.next();
            logger.debug("* FechaPublicacion=" + hit.get("fechaPublicacion") + " Id=" + hit.getId() + " S="
                    + hit.getScore() + "->" + hit.get("title"));
            i++;
        }
        logger.debug("* " + (i != 0 ? i - 1 : i) + " results");

        //(paramBusq.getBusquedaSimpleAvanzada()!=null && paramBusq.getBusquedaSimpleAvanzada().equals(BUSCARRSS))?new Sort(new SortField(props.getProperty("campo_fechaPublicacion"),SortField.STRING,true)):new Sort(new SortField(props.getProperty("campo_nivelAgregacion"),SortField.STRING,true)));
    } catch (java.lang.Exception e) {
        logger.error("Search failed", e);
        if (directorioIndiceSimple == null || searcher == null)
            logger.error(
                    "SrvBuscarServiceImpl - internaBusquedaAvanzada ERROR: No existe  ndice para el idioma = "
                            + paramBusq.getIdiomaBusqueda());
        else {
            Exception exc = new Exception("SrvBuscarServiceImpl - internaBusquedaAvanzada ERROR: Con query="
                    + paramBusq.getPalabrasClave() + " e idioma=" + paramBusq.getIdiomaBusqueda(), e);
            logger.error(exc);
            throw exc;
        }
    }
    return hits;
}

From source file:es.pode.indexador.negocio.servicios.busqueda.SrvBuscadorServiceImpl.java

License:Open Source License

private void addFiltersToQuery(java.util.HashMap filters, BooleanQuery q) throws IOException {

    // Search filters are "nillable" in the WS contract
    if (filters == null)
        return;/*from  ww w  . ja  va  2s . c  om*/

    // Add filter terms corresponding to each key in the map
    for (Object k : filters.keySet()) {
        if (k instanceof String) {

            if (k.equals("campo_formato")) {

                BooleanQuery queryFormato = new BooleanQuery();
                queryFormato.setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));

                Analyzer analyser = new StandardAnalyzer();
                /// We could change here the analyzer
                //Analyzer analyser = new WhitespaceAnalyzer();

                TokenStream stream = analyser.tokenStream((String) k,
                        new StringReader(filters.get(k).toString()));

                while (true) {
                    Token tok = stream.next();
                    if (tok == null)
                        break; // No more tokens for this filter field

                    queryFormato.add(new TermQuery(new Term(props.getProperty((String) k), tok.termText())),
                            BooleanClause.Occur.SHOULD);
                }

                q.add(queryFormato, BooleanClause.Occur.MUST);

            } else {

                // Each of these filtering fields is tokenised because it is
                // made available for arbitrary search with "contains" behavior.
                //
                // Use the default analyser to tokenise the search filter field
                // values before adding them as query sub-clauses.
                //
                // Note that if you ever need to add a filter corresponding to
                // an non-analysed field DO NOT tokenise it.

                Analyzer analyser = new StandardAnalyzer();
                /// We could change here the analyzer
                //Analyzer analyser = new WhitespaceAnalyzer();

                // Invoke toString() instead of checking and casting.
                // This would allow other Object types as values.

                TokenStream stream = analyser.tokenStream((String) k,
                        new StringReader(filters.get(k).toString()));

                // Unfortunately, stream does not support an iterator interface
                // so we will need to break out of an unbounded loop when done.

                while (true) {
                    Token tok = stream.next();
                    if (tok == null)
                        break; // No more tokens for this filter field

                    // A key represents a name for an indexed field; the value
                    // for which is in the properties configuration.

                    q.add(new TermQuery(new Term(props.getProperty((String) k), tok.termText())),
                            BooleanClause.Occur.MUST);
                }
            } //k.equals("campo_formato")
        }

    }
}

From source file:es.pode.indexador.negocio.servicios.busqueda.SrvBuscadorServiceImpl.java

License:Open Source License

/**
 * @see es.pode.indexador.negocio.servicios.busqueda.SrvBuscadorService#handleObtenerCatalogoRepositorio()
 * @param nivelAgregacion Nivel de agregacion minimo que tienen que cumplir los ODEs del catalogo que se genere.
 * @return ResultadoRepositorioVO[] Fecha Devuelve un array de objetos de valor con informaci n indexada de los ODEs.
 *///from  w w w .j  a  v a2  s.  co m
protected ResultadoRepositorioVO[] handleObtenerCatalogoRepositorioParam(Integer nivelAgregacion)
        throws Exception {

    String nivelAgregacionStr = "";
    if (nivelAgregacion == null) {
        logger.error("Error recuperando repositorio nivel agregacion[" + nivelAgregacion
                + "]. Nivel de agregacion nulo.");
        throw new Exception("Error recuperando repositorio nivel agregacion[" + nivelAgregacion
                + "]. Nivel de agregacion nulo.");
    } else {
        try {
            nivelAgregacionStr = Integer.toString(nivelAgregacion);
        } catch (Exception e) {
            logger.error("Error recuperando repositorio nivel agregacion[" + nivelAgregacion
                    + "]. Nivel de agregacion invalido.");
            throw new Exception("Error recuperando repositorio nivel agregacion[" + nivelAgregacion
                    + "]. Nivel de agregacion invalido.", e);
        }
    }
    //         Obtenemos todos los indices sobre los que hay objetos
    IndiceVO[] indices = new IndiceVO[0];
    try {
        indices = handleObtenerIdiomasBusqueda();
    } catch (Exception e) {
        logger.error("Error recuperando repositorio nivel agregacion[" + nivelAgregacion
                + "]. Imposible recuperar los indices.[" + e.getMessage() + "]");
        throw new Exception("Error recuperando repositorio nivel agregacion[" + nivelAgregacion
                + "]. Imposible recuperar los indices.", e);
    }
    //        Para cada indice, tenemos que recoger todos los odes.
    if (indices == null || indices.length == 0) {
        logger.error("Error recuperando repositorio nivel agregacion[" + nivelAgregacion
                + "]. No existen indices en el indexador. Imposible continuar.");
        throw new Exception("Error recuperando repositorio nivel agregacion[" + nivelAgregacion
                + "]. No existen indices en el indexador. Imposible continuar.");
    }

    //          Configuramos la query que se va a realizar sobre el indice
    BooleanQuery andQuery = new BooleanQuery();
    //         Configuramos el valor de memoria.   
    andQuery.setMaxClauseCount(Integer.parseInt(props.getProperty("maxClauseCount")));
    logger.debug("Recuperando repositorio  nivel agregacion[" + nivelAgregacion + "].");
    //Recogemos las descripciones del objetivo y le metemos la l gica, debe tener el nivel de agregacion mayor o igual que el que me pasan
    andQuery.add(getConstantScoreRangeQuery(props.getProperty(CAMPO_NIVEL_AGREGACION), nivelAgregacionStr, MAX),
            BooleanClause.Occur.MUST);

    //         Nos recorremos todos los indices realizando la misma consulta y recopilando la informacion que saquemos de cada indice
    ArrayList resultados = new ArrayList();
    for (int i = 0; i < indices.length; i++) {
        Directory directorioIndiceSimple = this.getIndexByLanguage(indices[i].getIdentificador());
        if (directorioIndiceSimple == null) {
            logger.error("Error recuperando repositorio nivel agregacion[" + nivelAgregacion
                    + "]. Indice para idioma[" + indices[i].getIdentificador()
                    + "] no accesible. Imposible buscar.");
            throw new Exception("Error recuperando repositorio nivel agregacion[" + nivelAgregacion
                    + "]. Indice para idioma[" + indices[i].getIdentificador()
                    + "] no accesible. Imposible buscar.");
        }
        Hits hits = null;
        try {
            IndexSearcher searcher = new IndexSearcher(directorioIndiceSimple);
            searcher.setSimilarity(new DefaultSimilarity());

            hits = searcher.search(andQuery);
            //                Dejamos de aplicar el filtro de licencia. Nos interesan todos los ODEs del repositorio
            //                hits = searcher.search(andQuery, crearFiltroLicencia());
        } catch (Exception e) {
            logger.error("Error recuperando repositorio nivel agregacion[" + nivelAgregacion
                    + "]. Error buscando en indice[" + indices[i].getIdentificador() + "] con query["
                    + andQuery.toString() + "].[" + e.getCause() + "]");
            //                En el caso de que el indice de error, miro por el resto.
            //                throw new Exception("Error recuperando repositorio. Error buscando en indice["+indices[i].getIdentificador()+"] con query["+andQuery.toString()+"].",e);
        }
        if (hits != null && hits.length() > 0) {
            logger.info("Recuperando repositorio nivel agregacion[" + nivelAgregacion
                    + "]. Informacion de repositorio disponible para idioma[" + indices[i].getIdentificador()
                    + "] query[" + andQuery.toString() + "] documentos[" + hits.length() + "]");
            try {
                resultados.addAll(Arrays.asList(mapDocToRepositorio(hits)));
            } catch (RuntimeException e) {
                logger.error("Error recuperando repositorio nivel agregacion[" + nivelAgregacion
                        + "]. Error mapeando resultados para indice[" + indices[i].getIdentificador()
                        + "] con query[" + andQuery.toString() + "].[" + e.getCause() + "]");
                throw new Exception("Error recuperando repositorio nivel agregacion[" + nivelAgregacion
                        + "]. Error mapeando resultados para indice[" + indices[i].getIdentificador()
                        + "] con query[" + andQuery.toString() + "].", e);
            }
        } else {
            logger.info("Recuperando repositorio nivel agregacion[" + nivelAgregacion
                    + "]. No hay informacion de repositorio disponible para idioma["
                    + indices[i].getIdentificador() + "] query[" + andQuery.toString() + "]");
        }
    }
    return (ResultadoRepositorioVO[]) resultados.toArray(new ResultadoRepositorioVO[resultados.size()]);
}

From source file:es.pode.indexador.negocio.servicios.busqueda.SrvBuscadorServiceImpl.java

License:Open Source License

/**
 * @see es.pode.indexador.negocio.servicios.busqueda.SrvBuscadorService#busquedaLOM_ESVSQL(es.pode.indexador.negocio.servicios.busqueda.ParamAvanzadoVO)
 * @param QuerySimpleVO Parametros de una query simple.
 * @return DocumentosLOM_ESVO Esta clase representa los documentos resultado de una busqueda por LOM_ES.
 *///w  ww.  j  av a 2  s .c o  m
protected DocumentosLOM_ESVO handleBusquedaLOM_ESVSQL(QuerySimpleVO paramBusqueda) throws Exception {
    DocumentosLOM_ESVO respuesta = new DocumentosLOM_ESVO();
    DocLOM_ESVO[] resultados = null;
    DisjunctionMaxQuery query = new DisjunctionMaxQuery(0.01f);
    String queryLang = paramBusqueda.getLenguajeQuery();
    String idioma = paramBusqueda.getIdioma();
    String unparsedQuery = paramBusqueda.getQuery();
    Hits hits = null;
    logger.debug(
            "Se ha recibido una query en lenguaje[" + queryLang + "] con contenido[" + unparsedQuery + "]");
    // Discriminar SQI / Lucene
    if (SQI_LANG.equals(queryLang)) {
        logger.debug("Parseando query SQI_LANG[" + unparsedQuery + "]");
        String[] terms = parsearVSQL(unparsedQuery);
        // Introduzco los terminos de busqueda en titulo, descripcion y
        // palabras clave
        logger.debug("Creando query a partir de terminos[" + terms + "] con longitud [" + terms.length);
        BooleanQuery query3 = new BooleanQuery();
        for (int i = 0; i < terms.length; i++) {
            BooleanQuery query2 = new BooleanQuery();
            if (this.contains(terms[i], ASTERISK) || this.contains(terms[i], QUESTIONMARK)) {
                if (logger.isDebugEnabled())
                    logger.debug("Esta query es una WildCardQUery");
                query2.add(getWildcardQuery(props.getProperty("campo_titulo"), terms[i].toLowerCase()),
                        BooleanClause.Occur.SHOULD);
                query2.add(getWildcardQuery(props.getProperty("campo_descripcion"), terms[i].toLowerCase()),
                        BooleanClause.Occur.SHOULD);
                query2.add(getWildcardQuery(props.getProperty("campo_palabrasClave"), terms[i].toLowerCase()),
                        BooleanClause.Occur.SHOULD);
            } else {
                if (logger.isDebugEnabled())
                    logger.debug("Es una query sin WildCardQuery");
                query2.add(getTermQuery(props.getProperty("campo_titulo"), terms[i].toLowerCase()),
                        BooleanClause.Occur.SHOULD);
                query2.add(getTermQuery(props.getProperty("campo_descripcion"), terms[i].toLowerCase()),
                        BooleanClause.Occur.SHOULD);
                query2.add(getTermQuery(props.getProperty("campo_palabrasClave"), terms[i].toLowerCase()),
                        BooleanClause.Occur.SHOULD);
            }
            query3.add(query2, BooleanClause.Occur.MUST);
        }
        query.add(query3);
        if (logger.isDebugEnabled())
            logger.debug("Consulta LOM_ES con query[" + query + "] a partir de SQUI lenguaje.");
    } else {
        logger.error("Se ha recibido una query que no es SQI ni Lucene =>[" + queryLang + "].");
        throw new Exception("Se ha recibido una query que no es SQI ni Lucene =>[" + queryLang + "].");
    }

    // Preparando busqueda
    logger.debug("Preparando busqueda");
    Directory directorioIndiceSimple = this.getIndexByLanguage(idioma);
    logger.debug("Directory directorioIndiceSimple[" + directorioIndiceSimple + "]");
    IndexSearcher searcher = new IndexSearcher(directorioIndiceSimple);
    searcher.setSimilarity(new DefaultSimilarity());
    if (logger.isDebugEnabled())
        logger.debug("Consulta LOM_ES con query[" + query.toString() + "]");
    hits = searcher.search(query);
    logger.debug("Numero de hits obtenidos[" + (hits != null ? hits.length() : 0) + "]");
    if (hits != null && hits.length() > 0) {
        logger.debug("Numero de hits[" + hits.length() + "]");

        resultados = new DocLOM_ESVO[hits.length()];

        //         logger.debug("resultados[" + resultados+"]");

        for (int i = 0; i < hits.length(); i++) {
            DocLOM_ESVO hitToDoc = new DocLOM_ESVO();
            Document doc = hits.doc(i);
            //            logger.debug("Document doc : " + doc);
            String localizador = doc.get(props.getProperty("campo_localizador"));

            logger.debug("localizador : " + localizador);
            hitToDoc.setRanking(new Integer(Float.floatToIntBits(hits.score(i))));

            Manifest manifest = this.parsearManifiesto(localizador + File.separator + "imsmanifest.xml");
            Lom lom = null;

            if (manifest != null) {
                //               logger.debug("manifest!=null " + manifest);

                ManifestAgrega ma = new ManifestAgrega(manifest);
                lom = ma.obtenerLom(manifest.getIdentifier(), null);
                //               lom = this.getLom(manifest.getMetadata(), manifest.getIdentifier());
                //               lomCastor = (es.pode.parseadorXML.lomes.Lom) beanMapper
                //                     .map(lom, es.pode.parseadorXML.lomes.Lom.class);
                LomAgrega agrega = new LomAgrega(lom);
                TechnicalAgrega tecnica = agrega.getTechnicalAgrega();
                ArrayList localizadores = new ArrayList();
                String hostNodo = AgregaPropertiesImpl.getInstance().getProperty(KEY_HOST_NODO);
                String local = props.getProperty(PROTOCOLO_HTTP) + hostNodo + props.getProperty(BUSCADOR_FICHA)
                        + idioma + props.getProperty(BARRA) + manifest.getIdentifier();
                localizadores.add(local);
                tecnica.setLocalizadorAv(localizadores);
                agrega.setTechnicalAgrega(tecnica);
                lom = agrega.getLom();
                //               creo un writer para escribir los metadatos
                StringWriter sw = new StringWriter();
                //completo el writer
                this.getLomesDao().escribirLom(lom, sw);
                hitToDoc.setDocumento(sw.toString());
                resultados[i] = hitToDoc;
            }
            //            logger.debug("manifest==null " + manifest);
        }
        respuesta.setResultados(resultados);
    }
    return respuesta;
}