List of usage examples for org.apache.lucene.search IndexSearcher setSimilarity
public void setSimilarity(Similarity similarity)
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()); }