/* * DrakkarKeel - An Enterprise Collaborative Search Platform * * The contents of this file are subject under the terms described in the * DRAKKARKEEL_LICENSE file included in this distribution; you may not use this * file except in compliance with the License. * * 2013-2014 DrakkarKeel Platform. */ package drakkar.mast.retrieval.improves; import drakkar.oar.DocumentMetaData; import drakkar.oar.ResultSetMetaData; import drakkar.oar.util.KeySearchable; import static drakkar.oar.util.KeySearchable.*; import drakkar.mast.SearchException; import drakkar.mast.SearchableException; import drakkar.mast.retrieval.AdvSearchEngine; import drakkar.mast.retrieval.Searchable; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Esta clase maneja todos los métodos de búsqueda no colaborativa con fusión de * resultados, que pueden ser invocados por los clientes * * */ public class DefaultMetaSearch extends SearchFactory { /** * Constructor de la clase * * @param searcher lista de buscadores */ public DefaultMetaSearch(Map<Integer, Searchable> searcherHash, List<Searchable> searchersList) { super(searcherHash, searchersList); } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando todos * los buscadores activos en el servidor * * @param query consulta de la búsqueda * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * */ public ResultSetMetaData search(String query, boolean caseSensitive) throws SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; for (Searchable item : searchersList) { if (item.isEnabled()) { temp = item.search(query, caseSensitive); results.add(item.getID(), temp); } } ResultSetMetaData docs = metaSearch(results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando todos * los buscadores activos en el servidor * * @param query consulta de la búsqueda * @param field campo del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda */ public ResultSetMetaData search(String query, int field, boolean caseSensitive) throws SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; for (Searchable item : searchersList) { if (item.isEnabled() && item instanceof AdvSearchEngine) { temp = ((AdvSearchEngine) item).search(query, field, caseSensitive); results.add( item.getID(), temp); } } ResultSetMetaData docs = metaSearch(results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando todos * los buscadores activos en el servidor * * @param query consulta de la búsqueda * @param fields campos del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * */ public ResultSetMetaData search(String query, int[] fields, boolean caseSensitive) throws SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; for (Searchable item : searchersList) { if (item.isEnabled() && item instanceof AdvSearchEngine) { temp = ((AdvSearchEngine) item).search(query, fields, caseSensitive); results.add(item.getID(), temp); } } ResultSetMetaData docs = metaSearch(results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando todos * los buscadores activos en el servidor * * @param query consulta de la búsqueda * @param docType tipo de documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * */ public ResultSetMetaData search(String query, String docType, boolean caseSensitive) throws SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; for (Searchable item : searchersList) { if (item.isEnabled()) { temp = item.search(query, docType, caseSensitive); results.add( item.getID(), temp); } } ResultSetMetaData docs = metaSearch( results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando todos * los buscadores activos en el servidor * * @param query consulta de la búsqueda * @param docTypes tipo de documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * */ public ResultSetMetaData search(String query, String[] docTypes, boolean caseSensitive) throws SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; for (Searchable item : searchersList) { if (item.isEnabled()) { temp = item.search(query, docTypes, caseSensitive); results.add( item.getID(), temp); } } ResultSetMetaData docs = metaSearch( results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando todos * los buscadores activos en el servidor * * @param query consulta de la búsqueda * @param docType tipo de documento * @param field campo del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * */ public ResultSetMetaData search(String query, String docType, int field, boolean caseSensitive) throws SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; AdvSearchEngine engine; for (Searchable item : searchersList) { if (item.isEnabled() && item instanceof AdvSearchEngine) { engine = (AdvSearchEngine) item; temp = engine.search(query, docType, field, caseSensitive); results.add( item.getID(), temp); } } ResultSetMetaData docs = metaSearch( results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando todos * los buscadores activos en el servidor * * @param query consulta de la búsqueda * @param docType tipo de documento * @param fields campos del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * */ public ResultSetMetaData search(String query, String docType, int[] fields, boolean caseSensitive) throws SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; for (Searchable item : searchersList) { if (item.isEnabled() && item instanceof AdvSearchEngine) { temp = ((AdvSearchEngine) item).search(query, docType, fields, caseSensitive); results.add( item.getID(), temp); } } ResultSetMetaData docs = metaSearch( results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando todos * los buscadores activos en el servidor * * @param query consulta de la búsqueda * @param docTypes tipo de documento * @param field campos del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * */ public ResultSetMetaData search(String query, String[] docTypes, int field, boolean caseSensitive) throws SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; for (Searchable item : searchersList) { if (item.isEnabled() && item instanceof AdvSearchEngine) { temp = ((AdvSearchEngine) item).search(query, docTypes, field, caseSensitive); results.add( item.getID(), temp); } } ResultSetMetaData docs = metaSearch( results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando todos * los buscadores activos en el servidor * * @param query consulta de la búsqueda * @param docTypes tipo de documento * @param fields campos del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * */ public ResultSetMetaData search(String query, String[] docTypes, int[] fields, boolean caseSensitive) throws SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; for (Searchable item : searchersList) { if (item.isEnabled() && item instanceof AdvSearchEngine) { temp = ((AdvSearchEngine) item).search(query, docTypes, fields, caseSensitive); results.add( item.getID(), temp); } } ResultSetMetaData docs = metaSearch( results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando los * los buscadores seleccionados * * @param searchers buscadores * @param query consulta de la búsqueda * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchableException si el buscador especificado no es soportado por el servidor * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public ResultSetMetaData search(int[] searchers, String query, boolean caseSensitive) throws SearchableException, SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; Searchable searcherItem; for (Integer item : searchers) { searcherItem = this.searchersHash.get(item); if (searcherItem != null) { if (searcherItem.isEnabled()) { temp = searcherItem.search(query, caseSensitive); results.add( searcherItem.getID(), temp); } } } if (results.isEmpty()) { throw new SearchableException("Searchable not supported"); } ResultSetMetaData docs = metaSearch( results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando los * los buscadores seleccionados * * @param searchers buscadores * @param query consulta de la búsqueda * @param field campo del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchableException si el buscador especificado no es soportado por el servidor * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public ResultSetMetaData search(int[] searchers, String query, int field, boolean caseSensitive) throws SearchableException, SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; Searchable searcherItem; for (Integer item : searchers) { searcherItem = this.searchersHash.get(item); if (searcherItem != null) { if (searcherItem.isEnabled() && searcherItem instanceof AdvSearchEngine) { temp = ((AdvSearchEngine) searcherItem).search(query, field, caseSensitive); results.add(searcherItem.getID(), temp); } } } if (results.isEmpty()) { throw new SearchableException("Searchable not supported"); } ResultSetMetaData docs = metaSearch( results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando los * los buscadores seleccionados * * @param searchers buscadores * @param query consulta de la búsqueda * @param fields campos del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchableException si el buscador especificado no es soportado por el servidor * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public ResultSetMetaData search(int[] searchers, String query, int[] fields, boolean caseSensitive) throws SearchableException, SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; Searchable searcherItem; for (Integer item : searchers) { searcherItem = this.searchersHash.get(item); if (searcherItem != null) { if (searcherItem.isEnabled() && searcherItem instanceof AdvSearchEngine) { temp = ((AdvSearchEngine) searcherItem).search(query, fields, caseSensitive); results.add(searcherItem.getID(), temp); } } } if (results.isEmpty()) { throw new SearchableException("Searchable not supported"); } ResultSetMetaData docs = metaSearch( results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando los * los buscadores seleccionados * * @param searchers buscadores * @param query consulta de la búsqueda * @param docType tipo de documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchableException si el buscador especificado no es soportado por el servidor * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public ResultSetMetaData search(int[] searchers, String query, String docType, boolean caseSensitive) throws SearchableException, SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; Searchable searcherItem; for (Integer item : searchers) { searcherItem = this.searchersHash.get(item); if (searcherItem != null) { if (searcherItem.isEnabled()) { temp = searcherItem.search(query, docType, caseSensitive); results.add(searcherItem.getID(), temp); } } } if (results.isEmpty()) { throw new SearchableException("Searchable not supported"); } ResultSetMetaData docs = metaSearch( results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando los * los buscadores seleccionados * * @param searchers buscadores * @param query consulta de la búsqueda * @param docTypes tipos de documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchableException si el buscador especificado no es soportado por el servidor * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public ResultSetMetaData search(int[] searchers, String query, String[] docTypes, boolean caseSensitive) throws SearchableException, SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; Searchable searcherItem; for (Integer item : searchers) { searcherItem = this.searchersHash.get(item); if (searcherItem != null) { if (searcherItem.isEnabled()) { temp = searcherItem.search(query, docTypes, caseSensitive); results.add(searcherItem.getID(), temp); } } } if (results.isEmpty()) { throw new SearchableException("Searchable not supported"); } ResultSetMetaData docs = metaSearch( results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando los * los buscadores seleccionados * * @param searchers buscadores * @param query consulta de la búsqueda * @param docType tipo de documento * @param field campo del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchableException si el buscador especificado no es soportado por el servidor * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public ResultSetMetaData search(int[] searchers, String query, String docType, int field, boolean caseSensitive) throws SearchableException, SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; Searchable searcherItem; for (Integer item : searchers) { searcherItem = this.searchersHash.get(item); if (searcherItem != null) { if (searcherItem.isEnabled() && searcherItem instanceof AdvSearchEngine) { temp = ((AdvSearchEngine) searcherItem).search(query, docType, field, caseSensitive); results.add(searcherItem.getID(), temp); } } } if (results.isEmpty()) { throw new SearchableException("Searchable not supported"); } ResultSetMetaData docs = metaSearch( results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando los * los buscadores seleccionados * * @param searchers buscadores * @param query consulta de la búsqueda * @param docType tipo de documento * @param fields campos del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchableException si el buscador especificado no es soportado por el servidor * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public ResultSetMetaData search(int[] searchers, String query, String docType, int[] fields, boolean caseSensitive) throws SearchableException, SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; Searchable searcherItem; for (Integer item : searchers) { searcherItem = this.searchersHash.get(item); if (searcherItem != null) { if (searcherItem.isEnabled() && searcherItem instanceof AdvSearchEngine) { temp = ((AdvSearchEngine) searcherItem).search(query, docType, fields, caseSensitive); results.add(searcherItem.getID(), temp); } } } if (results.isEmpty()) { throw new SearchableException("Searchable not supported"); } ResultSetMetaData docs = metaSearch( results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando los * los buscadores seleccionados * * @param searchers buscadores * @param query consulta de la búsqueda * @param docTypes tipos de documento * @param field campo del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchableException si el buscador especificado no es soportado por el servidor * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public ResultSetMetaData search(int[] searchers, String query, String[] docTypes, int field, boolean caseSensitive) throws SearchableException, SearchException { ResultSetMetaData results = new ResultSetMetaData(query); ArrayList<DocumentMetaData> temp = null; Searchable searcherItem; for (Integer item : searchers) { searcherItem = this.searchersHash.get(item); if (searcherItem != null) { if (searcherItem.isEnabled() && searcherItem instanceof AdvSearchEngine) { temp = ((AdvSearchEngine) searcherItem).search(query, docTypes, field, caseSensitive); results.add(searcherItem.getID(), temp); } } } if (results.isEmpty()) { throw new SearchableException("Searchable not supported"); } ResultSetMetaData docs = metaSearch( results); return docs; } /** * Invoca una búsqueda a partir de los parámetros de entrada, empleando los * los buscadores seleccionados * * @param searchers buscadores * @param query consulta de la búsqueda * @param docTypes tipos de documento * @param fields campos del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * * @return lista de documentos encontrados * * @throws SearchableException si el buscador especificado no es soportado por el servidor * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public ResultSetMetaData search(int[] searchers, String query, String[] docTypes, int[] fields, boolean caseSensitive) throws SearchableException, SearchException { ResultSetMetaData results = new ResultSetMetaData(); ArrayList<DocumentMetaData> temp = null; Searchable searcherItem; for (Integer item : searchers) { searcherItem = this.searchersHash.get(item); if (searcherItem != null) { if (searcherItem.isEnabled() && searcherItem instanceof AdvSearchEngine) { temp = ((AdvSearchEngine) searcherItem).search(query, docTypes, fields, caseSensitive); results.add(searcherItem.getID(), temp); } } } if (results.isEmpty()) { throw new SearchableException("Searchable not supported"); } ResultSetMetaData docs = metaSearch( results); return docs; } private ResultSetMetaData metaSearch(ResultSetMetaData results) { List<DocumentMetaData> metaResults; metaResults = RankingFusion.fusion(results, RankingFusion.DEFAULT_NORMALIZE, RankingFusion.DEFAULT_COMBINER); ResultSetMetaData docs = new ResultSetMetaData(results.getQuery(), MULTIPLE_SEARCHERS, metaResults); return docs; } /** * Este método es empleado internamente por los métodos <code>executeSearch(...)</code> * que emplean el mecanismo multi-search en sus dos variantes, con el * propósito de eliminar los documentos repetidos. * * @param list lista de Documentos. * * @return lista de Documentos sin repeticiones. */ private List<ResultSetMetaData> removeRepeatedDocuments(List<ResultSetMetaData> list) { ResultSetMetaData documentsList, documentsTemp; List<DocumentMetaData> documents, temp; DocumentMetaData metaDocument; int next, index = 0; int size = list.size(); for (int i = 0; i < size; i++) { documentsList = list.get(i); documents = documentsList.getAllResultList(); next = 0; for (int j = 0; j < documents.size(); j++) { metaDocument = documents.get(j); next = i + 1; if (next < size) { documentsTemp = list.get(next); temp = documentsTemp.getAllResultList(); index = temp.indexOf(metaDocument); if (index >= 0) { temp.remove(index); } } } } return list; } }