Example usage for org.apache.lucene.index MultiReader MultiReader

List of usage examples for org.apache.lucene.index MultiReader MultiReader

Introduction

In this page you can find the example usage for org.apache.lucene.index MultiReader MultiReader.

Prototype

public MultiReader(IndexReader... subReaders) throws IOException 

Source Link

Document

Construct a MultiReader aggregating the named set of (sub)readers.

Usage

From source file:org.pageseeder.flint.lucene.LuceneIndexQueries.java

License:Apache License

/**
 * Run a search on the given Indexes.//from   ww w. java  2 s  . c  om
 *
 * @param indexes  the Indexes to run the search on
 * @param query    the query to run
 * @param paging   paging details (can be <code>null</code>)
 *
 * @return the search results
 *
 * @throws IndexException if any error occurred while performing the search
 */
public static SearchResults query(List<Index> indexes, SearchQuery query, SearchPaging paging)
        throws IndexException {
    Query lquery = query.toQuery();
    if (lquery == null)
        throw new IndexException("Failed performing a query because the query is null",
                new NullPointerException("Null query"));
    // find all readers
    Map<LuceneIndexIO, IndexReader> readersMap = new HashMap<>();
    IndexReader[] readers = new IndexReader[indexes.size()];
    // grab a reader for each indexes
    for (int i = 0; i < indexes.size(); i++) {
        LuceneIndexIO io = getIndexIO(indexes.get(i));
        // make sure index has been setup
        if (io != null) {
            // grab what we need
            IndexReader reader = io.bookReader();
            readers[i] = reader;
            readersMap.put(io, reader);
        }
    }
    try {
        MultiReader reader = new MultiReader(readers);
        IndexSearcher searcher = new IndexSearcher(reader);
        LOGGER.debug("Performing search [{}] on {} indexes", query, readers.length);
        Sort sort = query.getSort();
        if (sort == null)
            sort = Sort.INDEXORDER;
        // load the scores
        TopFieldDocs results = searcher.search(lquery, paging.getHitsPerPage() * paging.getPage(), sort);
        return new SearchResults(query, results, paging, readersMap, searcher);
    } catch (IOException e) {
        for (LuceneIndexIO io : readersMap.keySet())
            io.releaseReader(readersMap.get(io));
        throw new IndexException("Failed performing a query on the Index because of an I/O problem", e);
    }
}

From source file:org.pageseeder.flint.lucene.search.Facets.java

License:Apache License

/**
 * Returns the list of term and how frequently they are used by performing a fuzzy match on the
 * specified term.//from w w w . ja va 2 s .c om
 *
 * @param fields the fields to use as facets
 * @param upTo   the max number of values to return
 * @param query  a predicate to apply on the facet (can be null or empty)
 *
 * @throws IndexException if there was an error reading the indexes or creating the condition query
 * @throws IllegalStateException If one of the indexes is not initialised
 */
public static List<FieldFacet> getFacets(List<String> fields, int upTo, Query query, List<Index> indexes)
        throws IOException, IndexException {
    // parameter checks
    if (fields == null || fields.isEmpty() || indexes.isEmpty())
        return Collections.emptyList();
    // check for one index only
    if (indexes.size() == 1)
        return getFacets(fields, upTo, query, indexes.get(0));
    // retrieve all searchers and readers
    Map<Index, IndexReader> readers = new HashMap<>();
    // grab a reader for each indexes
    for (int i = 0; i < indexes.size(); i++) {
        Index index = indexes.get(i);
        readers.put(index, LuceneIndexQueries.grabReader(index));
    }
    List<FieldFacet> facets = new ArrayList<FieldFacet>();
    try {
        // Retrieve all terms for the field
        IndexReader multiReader = new MultiReader(readers.values().toArray(new IndexReader[] {}));
        IndexSearcher multiSearcher = new IndexSearcher(multiReader);
        for (String field : fields) {
            if (field.length() > 0) {
                FieldFacet facet = FieldFacet.newFacet(field, multiReader);
                // search
                facet.compute(multiSearcher, query, upTo);
                // store it
                facets.add(facet);
            }
        }
    } finally {
        // now release everything we used
        for (Entry<Index, IndexReader> entry : readers.entrySet()) {
            LuceneIndexQueries.release(entry.getKey(), entry.getValue());
        }
    }
    return facets;
}

From source file:org.pageseeder.flint.lucene.search.Facets.java

License:Apache License

/**
 * Returns the list of term and how frequently they are used by performing a fuzzy match on the
 * specified term./*from   w  w w.ja  va  2s  .  c  o m*/
 *
 * @param fields     the fields to use as facets
 * @param maxValues  the max number of values to return
 * @param indexes    the indexes to search
 *
 * @throws IndexException if there was an error reading the indexes or creating the condition query
 * @throws IllegalStateException If one of the indexes is not initialised
 */
public static List<FieldFacet> getFacets(List<String> fields, int maxValues, List<Index> indexes)
        throws IOException, IndexException {
    // retrieve all searchers and readers
    Map<Index, IndexReader> readers = new HashMap<>();
    // grab a reader for each indexes
    for (int i = 0; i < indexes.size(); i++) {
        Index index = indexes.get(i);
        readers.put(index, LuceneIndexQueries.grabReader(index));
    }
    List<FieldFacet> facets = new ArrayList<FieldFacet>();
    try {
        // Retrieve all terms for the field
        IndexReader multiReader = new MultiReader(readers.values().toArray(new IndexReader[] {}));
        IndexSearcher multiSearcher = new IndexSearcher(multiReader);
        // loop through fields
        List<String> loopfields = fields == null ? Terms.fields(multiReader) : fields;
        for (String field : loopfields) {
            if (field.length() > 0) {
                FieldFacet facet = FieldFacet.newFacet(field, multiReader, maxValues);
                if (facet != null) {
                    facet.compute(multiSearcher, null, maxValues);
                    facets.add(facet);
                }
            }
        }
    } finally {
        // now release everything we used
        for (Entry<Index, IndexReader> entry : readers.entrySet()) {
            LuceneIndexQueries.release(entry.getKey(), entry.getValue());
        }
    }
    return facets;
}

From source file:org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.help.HelpManager.java

IndexSearcher makeIndexSearcher() throws IOException {
    ArrayList<IndexReader> readers = getReaders();

    IndexReader[] ireaders = new IndexReader[readers.size()];
    for (int i = 0; i < readers.size(); i++) {
        ireaders[i] = readers.get(i);//w ww  .j a  va2s .  c o  m
    }
    IndexReader ireader = new MultiReader(ireaders);
    return new IndexSearcher(ireader);
}

From source file:org.sakaiproject.search.index.impl.ClusterFSIndexStorage.java

License:Educational Community License

private IndexReader getIndexReader(boolean withLock) throws IOException {
    if (withLock) {
        clusterFS.getLock();//from ww w.j a  v  a 2  s.  co m
    }
    List<SegmentInfo> segments = clusterFS.updateSegments();
    if (log.isDebugEnabled())
        log.debug("Found " + segments.size() + " segments ");
    IndexReader[] readers = new IndexReader[segments.size()];
    int j = 0;
    for (Iterator<SegmentInfo> i = segments.iterator(); i.hasNext();) {
        SegmentInfo segment = i.next();
        try {
            if (!segment.checkSegmentValidity(diagnostics, "getIndexReader ")) {
                log.warn("Checksum Failed on  " + segment);
                segment.checkSegmentValidity(true, "getIndexReader Failed");
            }
            readers[j] = IndexReader.open(FSDirectory.open(segment.getSegmentLocation()), false);
        } catch (Exception ex) {
            try {
                if (readers[j] != null) {
                    try {
                        readers[j].close();
                        readers[j] = null;
                    } catch (Exception e) {
                        log.debug(e);
                    }
                }

                if (log.isDebugEnabled())
                    log.debug("Invalid segment  ", ex);
                log.warn("Found corrupted segment (" + segment.getName()
                        + ") in Local store, attempting to recover from DB.  Reason: " + ex.getClass().getName()
                        + ":" + ex.getMessage(), ex);
                clusterFS.recoverSegment(segment);
                readers[j] = IndexReader.open(FSDirectory.open(segment.getSegmentLocation()), false);
                log.warn(
                        "Recovery complete, resuming normal operations having restored, ignore previous problems with this segment "
                                + segment.getName());
            } catch (Exception e) {
                if (readers[j] != null) {
                    try {
                        readers[j].close();
                        readers[j] = null;
                    } catch (Exception ex2) {
                        log.debug(e);
                    }
                }
                log.error("---Problem recovering corrupted segment from the DB,\n"
                        + "--- it is probably that there has been a local hardware\n"
                        + "--- failure on this node or that the backup in the DB is missing\n"
                        + "--- or corrupt. To recover, remove the segment from the db, and rebuild the index \n"
                        + "--- eg delete from search_segments where name_ = '" + segment.getName() + "'; \n",
                        ex);

            }
        }
        j++;
    }
    List<IndexReader> l = new ArrayList<IndexReader>();
    for (int i = 0; i < readers.length; i++) {
        if (readers[i] != null) {
            l.add(readers[i]);
        }
    }
    if (l.size() != readers.length) {
        log.warn(
                " Opening index reader with a partial index set, this may result in a smallere search set than otherwise expected");
    }
    readers = l.toArray(new IndexReader[0]);
    if (readers.length > 0) {
        IndexReader indexReader = new MultiReader(readers);
        return indexReader;
    }
    throw new IOException("No Index available to open ");
}

From source file:org.silverpeas.core.index.search.model.IndexSearcher.java

License:Open Source License

/**
 * Return a multi-searcher built on the searchers list matching the (space, component) pair set.
 *///ww w.j  a  v a2 s.com
private org.apache.lucene.search.IndexSearcher getSearcher(Set<String> componentIds) throws ParseException {
    Set<String> indexPathSet = getIndexPathSet(componentIds);

    List<IndexReader> readers = new ArrayList<>();
    for (String path : indexPathSet) {
        final IndexReader indexReader = getIndexReader(path);
        if (indexReader != null) {
            readers.add(indexReader);
        }
    }
    try {
        return new org.apache.lucene.search.IndexSearcher(new MultiReader(readers.toArray(new IndexReader[0])));
    } catch (IOException e) {
        throw new org.silverpeas.core.index.search.model.ParseException(INDEX_SEARCH_ERROR, e);
    }
}

From source file:org.silverpeas.core.index.search.model.IndexSearcher.java

License:Open Source License

/**
 * Return a multi-searcher built on the searchers list matching the (space, component) pair set.
 *//*  ww w .j av  a 2s . c  o m*/
private org.apache.lucene.search.IndexSearcher getSearcher(QueryDescription query) throws ParseException {
    Set<String> indexPathSet = getIndexPathSet(query.getWhereToSearch());
    List<IndexReader> readers = new ArrayList<>();
    for (String path : indexPathSet) {
        IndexReader indexReader = getIndexReader(path);
        if (indexReader != null) {
            readers.add(indexReader);
        }
    }

    // Add searcher from external silverpeas server
    Set<ExternalComponent> extSearchers = query.getExtComponents();
    for (ExternalComponent externalComponent : extSearchers) {
        String externalComponentPath = getExternalComponentPath(externalComponent);
        IndexReader searcher = getIndexReader(externalComponentPath);
        if (searcher != null) {
            readers.add(searcher);
        }
    }
    try {
        return new org.apache.lucene.search.IndexSearcher(new MultiReader(readers.toArray(new IndexReader[0])));
    } catch (IOException ioe) {
        throw new org.silverpeas.core.index.search.model.ParseException(INDEX_SEARCH_ERROR, ioe);
    }
}

From source file:org.silverpeas.search.searchEngine.model.WAIndexSearcher.java

License:Open Source License

/**
 * Return a multi-searcher built on the searchers list matching the (space, component) pair set.
 */// w  ww . java  2s. c o  m
private IndexSearcher getSearcher(Set<SpaceComponentPair> spaceComponentPairSet) {
    Set<String> indexPathSet = getIndexPathSet(spaceComponentPairSet);

    List<IndexReader> readers = new ArrayList<IndexReader>();
    for (String path : indexPathSet) {
        IndexReader indexReader = getIndexReader(path);
        if (indexReader != null) {
            readers.add(indexReader);
        }
    }
    return new IndexSearcher(new MultiReader(readers.toArray(new IndexReader[readers.size()])));
}

From source file:org.silverpeas.search.searchEngine.model.WAIndexSearcher.java

License:Open Source License

/**
 * Return a multi-searcher built on the searchers list matching the (space, component) pair set.
 *///  w  ww  .j  a v  a  2s .com
private IndexSearcher getSearcher(QueryDescription query) {
    Set<String> indexPathSet = getIndexPathSet(query.getSpaceComponentPairSet());
    List<IndexReader> readers = new ArrayList<IndexReader>();
    for (String path : indexPathSet) {
        IndexReader indexReader = getIndexReader(path);
        if (indexReader != null) {
            readers.add(indexReader);
        }
    }

    // Add searcher from external silverpeas server
    Set<ExternalComponent> extSearchers = query.getExtComponents();
    for (ExternalComponent externalComponent : extSearchers) {
        String externalComponentPath = getExternalComponentPath(externalComponent);
        IndexReader searcher = getIndexReader(externalComponentPath);
        if (searcher != null) {
            readers.add(searcher);
        }
    }
    return new IndexSearcher(new MultiReader(readers.toArray(new IndexReader[readers.size()])));
}

From source file:org.uberfire.ext.metadata.backend.lucene.index.LuceneIndexManager.java

License:Apache License

public IndexSearcher getIndexSearcher(final ClusterSegment... clusterSegments) {
    final Set<KCluster> clusters;
    if (clusterSegments == null || clusterSegments.length == 0) {
        clusters = new HashSet<KCluster>(indexes.keySet());
    } else {/* w ww. ja  v  a  2  s . c  o m*/
        clusters = new HashSet<KCluster>(clusterSegments.length);
        for (final ClusterSegment clusterSegment : clusterSegments) {
            clusters.add(new KClusterImpl(clusterSegment.getClusterId()));
        }
    }

    final Collection<IndexReader> readers = new ArrayList<IndexReader>(clusters.size());
    for (final KCluster cluster : clusters) {
        final LuceneIndex index = indexes.get(cluster);
        readers.add(index.nrtReader());
    }

    try {
        return new SearcherFactory()
                .newSearcher(new MultiReader(readers.toArray(new IndexReader[readers.size()])), null);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}