Example usage for org.apache.lucene.search IndexSearcher setSimilarity

List of usage examples for org.apache.lucene.search IndexSearcher setSimilarity

Introduction

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

Prototype

public void setSimilarity(Similarity similarity) 

Source Link

Document

Expert: Set the Similarity implementation used by this IndexSearcher.

Usage

From source file:org.eclipse.recommenders.snipmatch.FileSnippetRepository.java

License:Open Source License

private Map<File, Float> searchSnippetFiles(ISearchContext context, int maxResults) {
    Map<File, Float> results = Maps.newLinkedHashMap();
    IndexSearcher searcher = null;
    try {/*from  w  w w  .  j  a  va2s  . com*/
        BooleanQuery query = new BooleanQuery();
        if (StringUtils.isBlank(context.getSearchText())) {
            query.add(new MatchAllDocsQuery(), Occur.MUST);
        } else {
            query.add(parser.parse(context.getSearchText()), Occur.MUST);
        }
        if (context.getLocation() != NONE) {
            query.add(new TermQuery(new Term(F_LOCATION, getIndexString(context.getLocation()))), Occur.MUST);
        }

        String filename = context.getFilename();
        if (filename != null) {
            BooleanQuery filenameRestrictionsQuery = new BooleanQuery();
            TermQuery noRestrictionQuery = new TermQuery(
                    new Term(F_FILENAME_RESTRICTION, NO_FILENAME_RESTRICTION));
            noRestrictionQuery.setBoost(NO_RESTRICTION_BOOST);
            filenameRestrictionsQuery.add(noRestrictionQuery, Occur.SHOULD);

            int i = 1;
            for (String restriction : Filenames.getFilenameRestrictions(filename)) {
                TermQuery restrictionQuery = new TermQuery(
                        new Term(F_FILENAME_RESTRICTION, restriction.toLowerCase()));
                float boost = (float) (0.5f + Math.pow(0.5, i));
                restrictionQuery.setBoost(boost);
                filenameRestrictionsQuery.add(restrictionQuery, Occur.SHOULD);
                i++;
            }
            query.add(filenameRestrictionsQuery, Occur.MUST);
        }

        searcher = new IndexSearcher(reader);
        searcher.setSimilarity(similarity);
        float maxScore = 0;
        for (ScoreDoc hit : searcher.search(query, null, maxResults).scoreDocs) {

            Document doc = searcher.doc(hit.doc);
            if (!snippetApplicable(doc, context)) {
                continue;
            }
            results.put(new File(doc.get(F_PATH)), hit.score);
            if (hit.score > maxScore) {
                maxScore = hit.score;
            }
        }
        return normalizeValues(results, maxScore);
    } catch (ParseException e) {
        // While typing, a user can easily create unparsable queries
        // (temporarily)
        log.info("Failed to parse query", e);
    } catch (Exception e) {
        log.error("Exception occurred while searching the snippet index.", e);
    } finally {
        IOUtils.closeQuietly(searcher);
    }
    return results;
}

From source file:org.elasticsearch.index.engine.EngineSearcherFactory.java

License:Apache License

@Override
public IndexSearcher newSearcher(IndexReader reader, IndexReader previousReader) throws IOException {
    IndexSearcher searcher = super.newSearcher(reader, previousReader);
    searcher.setQueryCache(engineConfig.getQueryCache());
    searcher.setQueryCachingPolicy(engineConfig.getQueryCachingPolicy());
    searcher.setSimilarity(engineConfig.getSimilarity());
    return searcher;
}

From source file:org.elasticsearch.index.engine.IndexSearcherWrappingService.java

License:Apache License

/**
 * If there are configured {@link IndexSearcherWrapper} instances, the {@link IndexSearcher} of the provided engine searcher
 * gets wrapped and a new {@link Engine.Searcher} instances is returned, otherwise the provided {@link Engine.Searcher} is returned.
 *
 * This is invoked each time a {@link Engine.Searcher} is requested to do an operation. (for example search)
 *//* w w  w  .j a  va2s.  c  om*/
public final Engine.Searcher wrap(EngineConfig engineConfig, final Engine.Searcher engineSearcher)
        throws IOException {
    final ElasticsearchDirectoryReader elasticsearchDirectoryReader = ElasticsearchDirectoryReader
            .getElasticsearchDirectoryReader(engineSearcher.getDirectoryReader());
    if (elasticsearchDirectoryReader == null) {
        throw new IllegalStateException("Can't wrap non elasticsearch directory reader");
    }
    if (wrapper == null) {
        return engineSearcher;
    }
    NonClosingReaderWrapper nonClosingReaderWrapper = new NonClosingReaderWrapper(
            engineSearcher.getDirectoryReader());
    DirectoryReader reader = wrapper.wrap(nonClosingReaderWrapper);
    if (reader != nonClosingReaderWrapper) {
        if (reader.getCoreCacheKey() != elasticsearchDirectoryReader.getCoreCacheKey()) {
            throw new IllegalStateException(
                    "wrapped directory reader doesn't delegate IndexReader#getCoreCacheKey, wrappers must override this method and delegate"
                            + " to the original readers core cache key. Wrapped readers can't be used as cache keys since their are used only per request which would lead to subtle bugs");
        }
        if (ElasticsearchDirectoryReader
                .getElasticsearchDirectoryReader(reader) != elasticsearchDirectoryReader) {
            // prevent that somebody wraps with a non-filter reader
            throw new IllegalStateException(
                    "wrapped directory reader hides actual ElasticsearchDirectoryReader but shouldn't");
        }
    }

    final IndexSearcher innerIndexSearcher = new IndexSearcher(reader);
    innerIndexSearcher.setQueryCache(engineConfig.getQueryCache());
    innerIndexSearcher.setQueryCachingPolicy(engineConfig.getQueryCachingPolicy());
    innerIndexSearcher.setSimilarity(engineConfig.getSimilarity());
    // TODO: Right now IndexSearcher isn't wrapper friendly, when it becomes wrapper friendly we should revise this extension point
    // For example if IndexSearcher#rewrite() is overwritten than also IndexSearcher#createNormalizedWeight needs to be overwritten
    // This needs to be fixed before we can allow the IndexSearcher from Engine to be wrapped multiple times
    final IndexSearcher indexSearcher = wrapper.wrap(engineConfig, innerIndexSearcher);
    if (reader == nonClosingReaderWrapper && indexSearcher == innerIndexSearcher) {
        return engineSearcher;
    } else {
        return new Engine.Searcher(engineSearcher.source(), indexSearcher) {
            @Override
            public void close() throws ElasticsearchException {
                try {
                    reader().close();
                    // we close the reader to make sure wrappers can release resources if needed....
                    // our NonClosingReaderWrapper makes sure that our reader is not closed
                } catch (IOException e) {
                    throw new ElasticsearchException("failed to close reader", e);
                } finally {
                    engineSearcher.close();
                }

            }
        };
    }
}

From source file:org.elasticsearch.index.search.child.ChildrenConstantScoreQuery.java

License:Apache License

@Override
public Weight createWeight(IndexSearcher searcher) throws IOException {
    SearchContext searchContext = SearchContext.current();
    BytesRefHash parentIds = new BytesRefHash(512, searchContext.pageCacheRecycler());
    ParentIdCollector collector = new ParentIdCollector(parentType, parentChildIndexFieldData, parentIds);
    final Query childQuery;
    if (rewrittenChildQuery == null) {
        childQuery = rewrittenChildQuery = searcher.rewrite(originalChildQuery);
    } else {/*  ww  w  . jav  a 2s  . co  m*/
        assert rewriteIndexReader == searcher.getIndexReader();
        childQuery = rewrittenChildQuery;
    }
    IndexSearcher indexSearcher = new IndexSearcher(searcher.getIndexReader());
    indexSearcher.setSimilarity(searcher.getSimilarity());
    indexSearcher.search(childQuery, collector);

    long remaining = parentIds.size();
    if (remaining == 0) {
        return Queries.newMatchNoDocsQuery().createWeight(searcher);
    }

    Filter shortCircuitFilter = null;
    if (remaining == 1) {
        BytesRef id = parentIds.get(0, new BytesRef());
        shortCircuitFilter = new TermFilter(
                new Term(UidFieldMapper.NAME, Uid.createUidAsBytes(parentType, id)));
    } else if (remaining <= shortCircuitParentDocSet) {
        shortCircuitFilter = new ParentIdsFilter(parentType, nonNestedDocsFilter, parentIds);
    }

    ParentWeight parentWeight = new ParentWeight(parentFilter, shortCircuitFilter, parentIds);
    searchContext.addReleasable(parentWeight);
    return parentWeight;
}

From source file:org.elasticsearch.index.search.child.ChildrenQuery.java

License:Apache License

@Override
public Weight createWeight(IndexSearcher searcher) throws IOException {
    SearchContext searchContext = SearchContext.current();

    final Query childQuery;
    if (rewrittenChildQuery == null) {
        childQuery = rewrittenChildQuery = searcher.rewrite(originalChildQuery);
    } else {//from   w w w  . java2s  .  co m
        assert rewriteIndexReader == searcher.getIndexReader();
        childQuery = rewrittenChildQuery;
    }
    IndexSearcher indexSearcher = new IndexSearcher(searcher.getIndexReader());
    indexSearcher.setSimilarity(searcher.getSimilarity());

    final BytesRefHash parentIds;
    final FloatArray scores;
    final IntArray occurrences;
    switch (scoreType) {
    case MAX:
        MaxCollector maxCollector = new MaxCollector(parentChildIndexFieldData, parentType, searchContext);
        indexSearcher.search(childQuery, maxCollector);
        parentIds = maxCollector.parentIds;
        scores = maxCollector.scores;
        occurrences = null;
        Releasables.release(maxCollector.parentIdsIndex);
        break;
    case SUM:
        SumCollector sumCollector = new SumCollector(parentChildIndexFieldData, parentType, searchContext);
        indexSearcher.search(childQuery, sumCollector);
        parentIds = sumCollector.parentIds;
        scores = sumCollector.scores;
        occurrences = null;
        Releasables.release(sumCollector.parentIdsIndex);
        break;
    case AVG:
        AvgCollector avgCollector = new AvgCollector(parentChildIndexFieldData, parentType, searchContext);
        indexSearcher.search(childQuery, avgCollector);
        parentIds = avgCollector.parentIds;
        scores = avgCollector.scores;
        occurrences = avgCollector.occurrences;
        Releasables.release(avgCollector.parentIdsIndex);
        break;
    default:
        throw new RuntimeException("Are we missing a score type here? -- " + scoreType);
    }

    int size = (int) parentIds.size();
    if (size == 0) {
        Releasables.release(parentIds, scores, occurrences);
        return Queries.newMatchNoDocsQuery().createWeight(searcher);
    }

    final Filter parentFilter;
    if (size == 1) {
        BytesRef id = parentIds.get(0, new BytesRef());
        if (nonNestedDocsFilter != null) {
            List<Filter> filters = Arrays.asList(
                    new TermFilter(new Term(UidFieldMapper.NAME, Uid.createUidAsBytes(parentType, id))),
                    nonNestedDocsFilter);
            parentFilter = new AndFilter(filters);
        } else {
            parentFilter = new TermFilter(new Term(UidFieldMapper.NAME, Uid.createUidAsBytes(parentType, id)));
        }
    } else if (size <= shortCircuitParentDocSet) {
        parentFilter = new ParentIdsFilter(parentType, nonNestedDocsFilter, parentIds);
    } else {
        parentFilter = new ApplyAcceptedDocsFilter(this.parentFilter);
    }
    ParentWeight parentWeight = new ParentWeight(rewrittenChildQuery.createWeight(searcher), parentFilter, size,
            parentIds, scores, occurrences);
    searchContext.addReleasable(parentWeight);
    return parentWeight;
}

From source file:org.elasticsearch.index.search.child.ParentConstantScoreQuery.java

License:Apache License

@Override
public Weight createWeight(IndexSearcher searcher) throws IOException {
    SearchContext searchContext = SearchContext.current();
    BytesRefHash parentIds = new BytesRefHash(512, searchContext.pageCacheRecycler());
    ParentIdsCollector collector = new ParentIdsCollector(parentType, parentChildIndexFieldData, parentIds);

    final Query parentQuery;
    if (rewrittenParentQuery != null) {
        parentQuery = rewrittenParentQuery;
    } else {/*ww w  .  j a  va2s.  c o  m*/
        assert rewriteIndexReader == searcher.getIndexReader();
        parentQuery = rewrittenParentQuery = originalParentQuery.rewrite(searcher.getIndexReader());
    }
    IndexSearcher indexSearcher = new IndexSearcher(searcher.getIndexReader());
    indexSearcher.setSimilarity(searcher.getSimilarity());
    indexSearcher.search(parentQuery, collector);

    if (parentIds.size() == 0) {
        return Queries.newMatchNoDocsQuery().createWeight(searcher);
    }

    ChildrenWeight childrenWeight = new ChildrenWeight(childrenFilter, parentIds);
    searchContext.addReleasable(childrenWeight);
    return childrenWeight;
}

From source file:org.elasticsearch.index.search.child.ParentQuery.java

License:Apache License

@Override
public Weight createWeight(IndexSearcher searcher) throws IOException {
    SearchContext searchContext = SearchContext.current();
    ParentIdAndScoreCollector collector = new ParentIdAndScoreCollector(searchContext,
            parentChildIndexFieldData, parentType);

    final Query parentQuery;
    if (rewrittenParentQuery == null) {
        parentQuery = rewrittenParentQuery = searcher.rewrite(originalParentQuery);
    } else {//  www . j a  v  a  2  s.  c  om
        assert rewriteIndexReader == searcher.getIndexReader();
        parentQuery = rewrittenParentQuery;
    }
    IndexSearcher indexSearcher = new IndexSearcher(searcher.getIndexReader());
    indexSearcher.setSimilarity(searcher.getSimilarity());
    indexSearcher.search(parentQuery, collector);
    FloatArray scores = collector.scores;
    BytesRefHash parentIds = collector.parentIds;

    if (parentIds.size() == 0) {
        Releasables.release(parentIds, scores);
        return Queries.newMatchNoDocsQuery().createWeight(searcher);
    }

    ChildWeight childWeight = new ChildWeight(searchContext, parentQuery.createWeight(searcher), childrenFilter,
            parentIds, scores);
    searchContext.addReleasable(childWeight);
    return childWeight;
}

From source file:org.elasticsearch.index.search.child.TopChildrenQuery.java

License:Apache License

@Override
public Weight createWeight(IndexSearcher searcher) throws IOException {
    Recycler.V<ObjectObjectOpenHashMap<Object, ParentDoc[]>> parentDocs = cacheRecycler.hashMap(-1);
    SearchContext searchContext = SearchContext.current();

    int parentHitsResolved;
    int requestedDocs = (searchContext.from() + searchContext.size());
    if (requestedDocs <= 0) {
        requestedDocs = 1;/*from  www  .j a  va  2 s .  co m*/
    }
    int numChildDocs = requestedDocs * factor;

    Query childQuery;
    if (rewrittenChildQuery == null) {
        childQuery = rewrittenChildQuery = searcher.rewrite(originalChildQuery);
    } else {
        assert rewriteIndexReader == searcher.getIndexReader();
        childQuery = rewrittenChildQuery;
    }

    IndexSearcher indexSearcher = new IndexSearcher(searcher.getIndexReader());
    indexSearcher.setSimilarity(searcher.getSimilarity());
    while (true) {
        parentDocs.v().clear();
        TopDocs topChildDocs = indexSearcher.search(childQuery, numChildDocs);
        try {
            parentHitsResolved = resolveParentDocuments(topChildDocs, searchContext, parentDocs);
        } catch (Exception e) {
            throw new IOException(e);
        }

        // check if we found enough docs, if so, break
        if (parentHitsResolved >= requestedDocs) {
            break;
        }
        // if we did not find enough docs, check if it make sense to search further
        if (topChildDocs.totalHits <= numChildDocs) {
            break;
        }
        // if not, update numDocs, and search again
        numChildDocs *= incrementalFactor;
        if (numChildDocs > topChildDocs.totalHits) {
            numChildDocs = topChildDocs.totalHits;
        }
    }

    ParentWeight parentWeight = new ParentWeight(rewrittenChildQuery.createWeight(searcher), parentDocs);
    searchContext.addReleasable(parentWeight);
    return parentWeight;
}

From source file:org.elasticsearch.index.shard.IndexSearcherWrapper.java

License:Apache License

/**
 * If there are configured {@link IndexSearcherWrapper} instances, the {@link IndexSearcher} of the provided engine searcher
 * gets wrapped and a new {@link Engine.Searcher} instances is returned, otherwise the provided {@link Engine.Searcher} is returned.
 *
 * This is invoked each time a {@link Engine.Searcher} is requested to do an operation. (for example search)
 *//*from   www.  j av a2  s .c om*/
public final Engine.Searcher wrap(Engine.Searcher engineSearcher) throws IOException {
    final ElasticsearchDirectoryReader elasticsearchDirectoryReader = ElasticsearchDirectoryReader
            .getElasticsearchDirectoryReader(engineSearcher.getDirectoryReader());
    if (elasticsearchDirectoryReader == null) {
        throw new IllegalStateException("Can't wrap non elasticsearch directory reader");
    }
    NonClosingReaderWrapper nonClosingReaderWrapper = new NonClosingReaderWrapper(
            engineSearcher.getDirectoryReader());
    DirectoryReader reader = wrap(nonClosingReaderWrapper);
    if (reader != nonClosingReaderWrapper) {
        if (reader.getCoreCacheKey() != elasticsearchDirectoryReader.getCoreCacheKey()) {
            throw new IllegalStateException(
                    "wrapped directory reader doesn't delegate IndexReader#getCoreCacheKey, wrappers must override this method and delegate"
                            + " to the original readers core cache key. Wrapped readers can't be used as cache keys since their are used only per request which would lead to subtle bugs");
        }
        if (ElasticsearchDirectoryReader
                .getElasticsearchDirectoryReader(reader) != elasticsearchDirectoryReader) {
            // prevent that somebody wraps with a non-filter reader
            throw new IllegalStateException(
                    "wrapped directory reader hides actual ElasticsearchDirectoryReader but shouldn't");
        }
    }

    final IndexSearcher origIndexSearcher = engineSearcher.searcher();
    final IndexSearcher innerIndexSearcher = new IndexSearcher(reader);
    innerIndexSearcher.setQueryCache(origIndexSearcher.getQueryCache());
    innerIndexSearcher.setQueryCachingPolicy(origIndexSearcher.getQueryCachingPolicy());
    innerIndexSearcher.setSimilarity(origIndexSearcher.getSimilarity(true));
    // TODO: Right now IndexSearcher isn't wrapper friendly, when it becomes wrapper friendly we should revise this extension point
    // For example if IndexSearcher#rewrite() is overwritten than also IndexSearcher#createNormalizedWeight needs to be overwritten
    // This needs to be fixed before we can allow the IndexSearcher from Engine to be wrapped multiple times
    final IndexSearcher indexSearcher = wrap(innerIndexSearcher);
    if (reader == nonClosingReaderWrapper && indexSearcher == innerIndexSearcher) {
        return engineSearcher;
    } else {
        return new Engine.Searcher(engineSearcher.source(), indexSearcher) {
            @Override
            public void close() throws ElasticsearchException {
                try {
                    reader().close();
                    // we close the reader to make sure wrappers can release resources if needed....
                    // our NonClosingReaderWrapper makes sure that our reader is not closed
                } catch (IOException e) {
                    throw new ElasticsearchException("failed to close reader", e);
                } finally {
                    engineSearcher.close();
                }

            }
        };
    }
}

From source file:org.elasticsearch.index.shard.IndexSearcherWrapperTests.java

License:Apache License

public void testIsCacheable() throws IOException {
    Directory dir = newDirectory();/*  w ww . j a  v a  2s.c  om*/
    IndexWriterConfig iwc = newIndexWriterConfig();
    IndexWriter writer = new IndexWriter(dir, iwc);
    Document doc = new Document();
    doc.add(new StringField("id", "1", random().nextBoolean() ? Field.Store.YES : Field.Store.NO));
    doc.add(new TextField("field", "doc", random().nextBoolean() ? Field.Store.YES : Field.Store.NO));
    writer.addDocument(doc);
    DirectoryReader open = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer, true),
            new ShardId("foo", 1));
    IndexSearcher searcher = new IndexSearcher(open);
    assertEquals(1, searcher.search(new TermQuery(new Term("field", "doc")), 1).totalHits);
    searcher.setSimilarity(iwc.getSimilarity());
    final AtomicInteger closeCalls = new AtomicInteger(0);
    IndexSearcherWrapper wrapper = new IndexSearcherWrapper() {
        @Override
        public DirectoryReader wrap(DirectoryReader reader) throws IOException {
            return new FieldMaskingReader("field", reader, closeCalls);
        }

        @Override
        public IndexSearcher wrap(EngineConfig engineConfig, IndexSearcher searcher) throws EngineException {
            return searcher;
        }
    };
    final ConcurrentHashMap<Object, TopDocs> cache = new ConcurrentHashMap<>();
    try (Engine.Searcher engineSearcher = new Engine.Searcher("foo", searcher)) {
        try (final Engine.Searcher wrap = new IndexSearcherWrappingService(Collections.singleton(wrapper))
                .wrap(ENGINE_CONFIG, engineSearcher)) {
            ElasticsearchDirectoryReader.addReaderCloseListener(wrap.getDirectoryReader(),
                    new IndexReader.ReaderClosedListener() {
                        @Override
                        public void onClose(IndexReader reader) throws IOException {
                            cache.remove(reader.getCoreCacheKey());
                        }
                    });
            TopDocs search = wrap.searcher().search(new TermQuery(new Term("field", "doc")), 1);
            cache.put(wrap.reader().getCoreCacheKey(), search);
        }
    }
    assertEquals(1, closeCalls.get());

    assertEquals(1, cache.size());
    IOUtils.close(open, writer, dir);
    assertEquals(0, cache.size());
    assertEquals(1, closeCalls.get());
}