List of usage examples for org.apache.lucene.search TopScoreDocCollector create
public static TopScoreDocCollector create(int numHits, int totalHitsThreshold)
From source file:org.drools.workbench.screens.guided.template.server.indexing.IndexGuidedRuleTemplateAttributesTest.java
License:Apache License
@Test public void testIndexGuidedRuleTemplateAttributes() throws IOException, InterruptedException { //Add test files final Path path = basePath.resolve("template1.template"); final TemplateModel model = GuidedRuleTemplateFactory.makeModelWithAttributes( "org.drools.workbench.screens.guided.template.server.indexing", new ArrayList<Import>() { {//from w w w. j a v a2 s .com add(new Import( "org.drools.workbench.screens.guided.template.server.indexing.classes.Applicant")); add(new Import( "org.drools.workbench.screens.guided.template.server.indexing.classes.Mortgage")); } }, "template1"); final String xml = RuleTemplateModelXMLPersistenceImpl.getInstance().marshal(model); ioService().write(path, xml); Thread.sleep(5000); //wait for events to be consumed from jgit -> (notify changes -> watcher -> index) -> lucene index final Index index = getConfig().getIndexManager() .get(org.uberfire.ext.metadata.io.KObjectUtil.toKCluster(basePath.getFileSystem())); { final IndexSearcher searcher = ((LuceneIndex) index).nrtSearcher(); final TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); final Query query = new QueryBuilder().addTerm(new ValueRuleAttributeIndexTerm("ruleflow-group")) .build(); searcher.search(query, collector); final ScoreDoc[] hits = collector.topDocs().scoreDocs; assertEquals(1, hits.length); final List<KObject> results = new ArrayList<KObject>(); for (int i = 0; i < hits.length; i++) { results.add(KObjectUtil.toKObject(searcher.doc(hits[i].doc))); } assertContains(results, path); ((LuceneIndex) index).nrtRelease(searcher); } //Rule Template defining a RuleFlow-Group named myRuleFlowGroup. This should match template1.template //This checks whether there is a Rule Attribute "ruleflow-group" and its Value is "myRuleflowGroup" { final IndexSearcher searcher = ((LuceneIndex) index).nrtSearcher(); final TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); final Query query = new QueryBuilder().addTerm(new ValueRuleAttributeIndexTerm("ruleflow-group")) .addTerm(new ValueRuleAttributeValueIndexTerm("myRuleFlowGroup")).build(); searcher.search(query, collector); final ScoreDoc[] hits = collector.topDocs().scoreDocs; assertEquals(1, hits.length); final List<KObject> results = new ArrayList<KObject>(); for (int i = 0; i < hits.length; i++) { results.add(KObjectUtil.toKObject(searcher.doc(hits[i].doc))); } assertContains(results, path); ((LuceneIndex) index).nrtRelease(searcher); } }
From source file:org.drools.workbench.screens.guided.template.server.indexing.IndexGuidedRuleTemplateConditionsTest.java
License:Apache License
@Test public void testIndexGuidedRuleTemplateConditions() throws IOException, InterruptedException { //Add test files final Path path = basePath.resolve("template1.template"); final TemplateModel model = GuidedRuleTemplateFactory.makeModelWithConditions( "org.drools.workbench.screens.guided.template.server.indexing", new ArrayList<Import>() { {/* w w w . j a va 2 s . c o m*/ add(new Import( "org.drools.workbench.screens.guided.template.server.indexing.classes.Applicant")); add(new Import( "org.drools.workbench.screens.guided.template.server.indexing.classes.Mortgage")); } }, "template1"); final String xml = RuleTemplateModelXMLPersistenceImpl.getInstance().marshal(model); ioService().write(path, xml); Thread.sleep(5000); //wait for events to be consumed from jgit -> (notify changes -> watcher -> index) -> lucene index final Index index = getConfig().getIndexManager() .get(org.uberfire.ext.metadata.io.KObjectUtil.toKCluster(basePath.getFileSystem())); { final IndexSearcher searcher = ((LuceneIndex) index).nrtSearcher(); final TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); final Query query = new QueryBuilder() .addTerm(new ValueTypeIndexTerm( "org.drools.workbench.screens.guided.template.server.indexing.classes.Applicant")) .build(); searcher.search(query, collector); final ScoreDoc[] hits = collector.topDocs().scoreDocs; assertEquals(1, hits.length); final List<KObject> results = new ArrayList<KObject>(); for (int i = 0; i < hits.length; i++) { results.add(KObjectUtil.toKObject(searcher.doc(hits[i].doc))); } assertContains(results, path); ((LuceneIndex) index).nrtRelease(searcher); } { final IndexSearcher searcher = ((LuceneIndex) index).nrtSearcher(); final TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); final Query query = new QueryBuilder() .addTerm(new ValueTypeIndexTerm( "org.drools.workbench.screens.guided.template.server.indexing.classes.Mortgage")) .build(); searcher.search(query, collector); final ScoreDoc[] hits = collector.topDocs().scoreDocs; assertEquals(1, hits.length); final List<KObject> results = new ArrayList<KObject>(); for (int i = 0; i < hits.length; i++) { results.add(KObjectUtil.toKObject(searcher.doc(hits[i].doc))); } assertContains(results, path); ((LuceneIndex) index).nrtRelease(searcher); } }
From source file:org.drools.workbench.screens.testscenario.backend.server.indexing.IndexTestScenarioTest.java
License:Apache License
@Test public void testIndexTestScenario() throws IOException, InterruptedException { //Add test files final Path path1 = basePath.resolve("scenario1.scenario"); final Scenario model1 = TestScenarioFactory.makeTestScenarioWithVerifyFact( "org.drools.workbench.screens.testscenario.backend.server.indexing", new ArrayList<Import>() { {//from w w w .ja v a 2s. co m add(new Import( "org.drools.workbench.screens.testscenario.backend.server.indexing.classes.Applicant")); add(new Import( "org.drools.workbench.screens.testscenario.backend.server.indexing.classes.Mortgage")); } }, "scenario1"); final String xml1 = ScenarioXMLPersistence.getInstance().marshal(model1); ioService().write(path1, xml1); final Path path2 = basePath.resolve("scenario2.scenario"); final Scenario model2 = TestScenarioFactory.makeTestScenarioWithoutVerifyFact( "org.drools.workbench.screens.testscenario.backend.server.indexing", new ArrayList<Import>() { { add(new Import( "org.drools.workbench.screens.testscenario.backend.server.indexing.classes.Applicant")); add(new Import( "org.drools.workbench.screens.testscenario.backend.server.indexing.classes.Mortgage")); } }, "scenario2"); final String xml2 = ScenarioXMLPersistence.getInstance().marshal(model2); ioService().write(path2, xml2); final Path path3 = basePath.resolve("scenario3.scenario"); final Scenario model3 = TestScenarioFactory.makeTestScenarioWithVerifyRuleFired( "org.drools.workbench.screens.testscenario.backend.server.indexing", new ArrayList<Import>() { { add(new Import( "org.drools.workbench.screens.testscenario.backend.server.indexing.classes.Applicant")); add(new Import( "org.drools.workbench.screens.testscenario.backend.server.indexing.classes.Mortgage")); } }, "scenario3"); final String xml3 = ScenarioXMLPersistence.getInstance().marshal(model3); ioService().write(path3, xml3); final Path path4 = basePath.resolve("scenario4.scenario"); final Scenario model4 = TestScenarioFactory.makeTestScenarioWithGlobalVerifyGlobal( "org.drools.workbench.screens.testscenario.backend.server.indexing", new ArrayList<Import>() { { add(new Import("java.util.Date")); } }, "scenario1"); final String xml4 = ScenarioXMLPersistence.getInstance().marshal(model4); ioService().write(path4, xml4); Thread.sleep(5000); //wait for events to be consumed from jgit -> (notify changes -> watcher -> index) -> lucene index final Index index = getConfig().getIndexManager() .get(org.uberfire.ext.metadata.io.KObjectUtil.toKCluster(basePath.getFileSystem())); //Test Scenarios using org.drools.workbench.screens.testscenario.backend.server.indexing.classes.Applicant { final IndexSearcher searcher = ((LuceneIndex) index).nrtSearcher(); final TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); final Query query = new QueryBuilder() .addTerm(new ValueTypeIndexTerm( "org.drools.workbench.screens.testscenario.backend.server.indexing.classes.Applicant")) .build(); searcher.search(query, collector); final ScoreDoc[] hits = collector.topDocs().scoreDocs; assertEquals(2, hits.length); final List<KObject> results = new ArrayList<KObject>(); for (int i = 0; i < hits.length; i++) { results.add(KObjectUtil.toKObject(searcher.doc(hits[i].doc))); } assertContains(results, path1); assertContains(results, path2); ((LuceneIndex) index).nrtRelease(searcher); } //Test Scenarios using org.drools.workbench.screens.testscenario.backend.server.indexing.classes.Mortgage { final IndexSearcher searcher = ((LuceneIndex) index).nrtSearcher(); final TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); final Query query = new QueryBuilder() .addTerm(new ValueTypeIndexTerm( "org.drools.workbench.screens.testscenario.backend.server.indexing.classes.Mortgage")) .build(); searcher.search(query, collector); final ScoreDoc[] hits = collector.topDocs().scoreDocs; assertEquals(1, hits.length); final List<KObject> results = new ArrayList<KObject>(); for (int i = 0; i < hits.length; i++) { results.add(KObjectUtil.toKObject(searcher.doc(hits[i].doc))); } assertContains(results, path1); ((LuceneIndex) index).nrtRelease(searcher); } //Test Scenarios using org.drools.workbench.screens.testscenario.backend.server.indexing.classes.Mortgage#amount { final IndexSearcher searcher = ((LuceneIndex) index).nrtSearcher(); final TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); final Query query = new QueryBuilder() .addTerm(new ValueTypeIndexTerm( "org.drools.workbench.screens.testscenario.backend.server.indexing.classes.Mortgage")) .addTerm(new ValueFieldIndexTerm("amount")).build(); searcher.search(query, collector); final ScoreDoc[] hits = collector.topDocs().scoreDocs; assertEquals(1, hits.length); final List<KObject> results = new ArrayList<KObject>(); for (int i = 0; i < hits.length; i++) { results.add(KObjectUtil.toKObject(searcher.doc(hits[i].doc))); } assertContains(results, path1); ((LuceneIndex) index).nrtRelease(searcher); } //Test Scenarios using java.lang.Integer { final IndexSearcher searcher = ((LuceneIndex) index).nrtSearcher(); final TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); final Query query = new QueryBuilder().addTerm(new ValueTypeIndexTerm("java.lang.Integer")).build(); searcher.search(query, collector); final ScoreDoc[] hits = collector.topDocs().scoreDocs; assertEquals(3, hits.length); final List<KObject> results = new ArrayList<KObject>(); for (int i = 0; i < hits.length; i++) { results.add(KObjectUtil.toKObject(searcher.doc(hits[i].doc))); } assertContains(results, path1); assertContains(results, path2); ((LuceneIndex) index).nrtRelease(searcher); } //Test Scenarios expecting rule "test" to fire { final IndexSearcher searcher = ((LuceneIndex) index).nrtSearcher(); final TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); final Query query = new QueryBuilder().addTerm(new ValueRuleIndexTerm("test")).build(); searcher.search(query, collector); final ScoreDoc[] hits = collector.topDocs().scoreDocs; assertEquals(1, hits.length); final List<KObject> results = new ArrayList<KObject>(); for (int i = 0; i < hits.length; i++) { results.add(KObjectUtil.toKObject(searcher.doc(hits[i].doc))); } assertContains(results, path3); ((LuceneIndex) index).nrtRelease(searcher); } { final IndexSearcher searcher = ((LuceneIndex) index).nrtSearcher(); final TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); final Query query = new QueryBuilder().addTerm(new ValueTypeIndexTerm("java.util.Date")).build(); searcher.search(query, collector); final ScoreDoc[] hits = collector.topDocs().scoreDocs; assertEquals(1, hits.length); final List<KObject> results = new ArrayList<KObject>(); for (int i = 0; i < hits.length; i++) { results.add(KObjectUtil.toKObject(searcher.doc(hits[i].doc))); } assertContains(results, path4); ((LuceneIndex) index).nrtRelease(searcher); } }
From source file:org.eclipse.skalli.core.search.LuceneIndex.java
License:Open Source License
private ScoreDoc getDocByUUID(IndexSearcher searcher, UUID uuid) throws IOException { Query query = null;/* w w w .j a va 2 s . com*/ try { QueryParser parser = new QueryParser(LUCENE_VERSION, FIELD_UUID, analyzer); query = parser.parse(StringUtils.lowerCase(uuid.toString())); } catch (ParseException e) { LOG.error(MessageFormat.format("Failed to create query from UUID {0}", uuid.toString()), e); return null; } TopScoreDocCollector collector = TopScoreDocCollector.create(2, false); searcher.search(query, collector); if (collector.getTotalHits() < 1) { return null; } if (collector.getTotalHits() > 1) { LOG.error(MessageFormat.format("Too many documents found with UUID {0}", uuid.toString())); return null; } ScoreDoc hit = collector.topDocs().scoreDocs[0]; return hit; }
From source file:org.eclipse.skalli.core.search.LuceneIndex.java
License:Open Source License
public synchronized SearchResult<T> moreLikeThis(T entity, String[] fields, int count) { long start = System.nanoTime(); SearchResult<T> moreLikeThis = new SearchResult<T>(); List<SearchHit<T>> searchHits = new LinkedList<SearchHit<T>>(); PagingInfo pagingInfo = new PagingInfo(0, 0); int totalHitCount = 0; if (initialized) { IndexReader reader = null;//from w w w . j av a 2 s.c o m IndexSearcher searcher = null; try { reader = IndexReader.open(directory); searcher = new IndexSearcher(reader); ScoreDoc baseDoc = getDocByUUID(searcher, entity.getUuid()); if (baseDoc != null) { MoreLikeThis mlt = new MoreLikeThis(searcher.getIndexReader()); mlt.setFieldNames(fields); mlt.setMinWordLen(2); mlt.setBoost(true); mlt.setMinDocFreq(0); mlt.setMinTermFreq(0); mlt.setAnalyzer(analyzer); Query query = mlt.like(baseDoc.doc); int numHits = Math.min(count + 1, entityService.size()); // count + 1: baseDoc will be one of the hits TopScoreDocCollector collector = TopScoreDocCollector.create(numHits, false); searcher.search(query, collector); List<String> fieldList = Arrays.asList(fields); Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query)); for (ScoreDoc hit : collector.topDocs().scoreDocs) { if (hit.doc != baseDoc.doc) { Document doc = searcher.doc(hit.doc); SearchHit<T> searchHit = getSearchHit(doc, fieldList, hit.score, highlighter); searchHits.add(searchHit); } } pagingInfo = new PagingInfo(0, count); totalHitCount = collector.getTotalHits() - 1; } } catch (Exception e) { LOG.error( MessageFormat.format("Searching for entities similiar to ''{0}'' failed", entity.getUuid()), e); } finally { closeQuietly(searcher); closeQuietly(reader); } } long nanoDuration = System.nanoTime() - start; long milliDuration = Math.round(nanoDuration / 1000000d); moreLikeThis.setPagingInfo(pagingInfo); moreLikeThis.setResultCount(totalHitCount); moreLikeThis.setResult(searchHits); moreLikeThis.setDuration(milliDuration); moreLikeThis.setResult(searchHits); return moreLikeThis; }
From source file:org.eclipse.skalli.core.search.LuceneIndex.java
License:Open Source License
private <R extends SearchResult<T>> R search(final String[] fields, String facetFields[], final String queryString, PagingInfo pagingInfo, R ret) throws QueryParseException { long start = System.nanoTime(); List<SearchHit<T>> resultList = new LinkedList<SearchHit<T>>(); int totalHitCount = 0; if (pagingInfo == null) { pagingInfo = new PagingInfo(0, 10); }/*from ww w . j a v a 2 s. c o m*/ if (StringUtils.equals("*", queryString) || StringUtils.isEmpty(queryString)) { //$NON-NLS-1$ List<T> allEntities = entityService.getAll(); List<T> sublist = allEntities.subList(Math.min(pagingInfo.getStart(), allEntities.size()), Math.min(pagingInfo.getStart() + pagingInfo.getCount(), allEntities.size())); resultList.addAll(entitiesToHit(sublist)); totalHitCount = allEntities.size(); } else if (initialized) { List<String> fieldList = Arrays.asList(fields); IndexReader reader = null; IndexSearcher searcher = null; try { reader = IndexReader.open(directory); searcher = new IndexSearcher(reader); QueryParser parser = new MultiFieldQueryParser(LUCENE_VERSION, fields, analyzer); Query query = getQuery(parser, queryString); // it is not possible that we have more hits than projects! int maxHits = entityService.size(); int numHits = pagingInfo.getStart() + pagingInfo.getCount(); if (numHits < 0 || numHits > maxHits) { numHits = maxHits; } if (numHits > 0) { TopDocsCollector<ScoreDoc> collector; if (facetFields == null) { collector = TopScoreDocCollector.create(numHits, false); } else { collector = new FacetedCollector(facetFields, searcher.getIndexReader(), numHits); } searcher.search(query, collector); Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query)); TopDocs topDocs = collector.topDocs(pagingInfo.getStart(), pagingInfo.getCount()); for (ScoreDoc hit : topDocs.scoreDocs) { Document doc = searcher.doc(hit.doc); SearchHit<T> searchHit = getSearchHit(doc, fieldList, hit.score, highlighter); resultList.add(searchHit); } totalHitCount = collector.getTotalHits(); if (collector instanceof FacetedCollector && ret instanceof FacetedSearchResult) { ((FacetedSearchResult<T>) ret).setFacetInfo(((FacetedCollector) collector).getFacetsMap()); } } } catch (Exception e) { LOG.error(MessageFormat.format("Searching with query ''{0}'' failed", queryString), e); } finally { closeQuietly(searcher); closeQuietly(reader); } } long nanoDuration = System.nanoTime() - start; long milliDuration = Math.round(nanoDuration / 1000000d); ret.setPagingInfo(pagingInfo); ret.setQueryString(queryString); ret.setResultCount(totalHitCount); ret.setResult(resultList); ret.setDuration(milliDuration); return ret; }
From source file:org.elasticsearch.index.search.child.ChildrenQueryTests.java
License:Apache License
@Test public void testRandom() throws Exception { Directory directory = newDirectory(); RandomIndexWriter indexWriter = new RandomIndexWriter(random(), directory); int numUniqueChildValues = 1 + random().nextInt(TEST_NIGHTLY ? 6000 : 600); String[] childValues = new String[numUniqueChildValues]; for (int i = 0; i < numUniqueChildValues; i++) { childValues[i] = Integer.toString(i); }//from w ww . j a v a2 s .c o m IntOpenHashSet filteredOrDeletedDocs = new IntOpenHashSet(); int childDocId = 0; int numParentDocs = 1 + random().nextInt(TEST_NIGHTLY ? 20000 : 1000); ObjectObjectOpenHashMap<String, NavigableMap<String, FloatArrayList>> childValueToParentIds = new ObjectObjectOpenHashMap<String, NavigableMap<String, FloatArrayList>>(); for (int parentDocId = 0; parentDocId < numParentDocs; parentDocId++) { boolean markParentAsDeleted = rarely(); boolean filterMe = rarely(); String parent = Integer.toString(parentDocId); Document document = new Document(); document.add(new StringField(UidFieldMapper.NAME, Uid.createUid("parent", parent), Field.Store.YES)); document.add(new StringField(TypeFieldMapper.NAME, "parent", Field.Store.NO)); if (markParentAsDeleted) { filteredOrDeletedDocs.add(parentDocId); document.add(new StringField("delete", "me", Field.Store.NO)); } if (filterMe) { filteredOrDeletedDocs.add(parentDocId); document.add(new StringField("filter", "me", Field.Store.NO)); } indexWriter.addDocument(document); int numChildDocs; if (rarely()) { numChildDocs = random().nextInt(TEST_NIGHTLY ? 100 : 25); } else { numChildDocs = random().nextInt(TEST_NIGHTLY ? 40 : 10); } for (int i = 0; i < numChildDocs; i++) { boolean markChildAsDeleted = rarely(); String childValue = childValues[random().nextInt(childValues.length)]; document = new Document(); document.add(new StringField(UidFieldMapper.NAME, Uid.createUid("child", Integer.toString(childDocId)), Field.Store.NO)); document.add(new StringField(TypeFieldMapper.NAME, "child", Field.Store.NO)); document.add( new StringField(ParentFieldMapper.NAME, Uid.createUid("parent", parent), Field.Store.NO)); document.add(new StringField("field1", childValue, Field.Store.NO)); if (markChildAsDeleted) { document.add(new StringField("delete", "me", Field.Store.NO)); } indexWriter.addDocument(document); if (!markChildAsDeleted) { NavigableMap<String, FloatArrayList> parentIdToChildScores; if (childValueToParentIds.containsKey(childValue)) { parentIdToChildScores = childValueToParentIds.lget(); } else { childValueToParentIds.put(childValue, parentIdToChildScores = new TreeMap<String, FloatArrayList>()); } if (!markParentAsDeleted && !filterMe) { FloatArrayList childScores = parentIdToChildScores.get(parent); if (childScores == null) { parentIdToChildScores.put(parent, childScores = new FloatArrayList()); } childScores.add(1f); } } } } // Delete docs that are marked to be deleted. indexWriter.deleteDocuments(new Term("delete", "me")); indexWriter.commit(); IndexReader indexReader = DirectoryReader.open(directory); IndexSearcher searcher = new IndexSearcher(indexReader); Engine.Searcher engineSearcher = new Engine.SimpleSearcher(ChildrenQueryTests.class.getSimpleName(), searcher); ((TestSearchContext) SearchContext.current()) .setSearcher(new ContextIndexSearcher(SearchContext.current(), engineSearcher)); ParentFieldMapper parentFieldMapper = SearchContext.current().mapperService().documentMapper("child") .parentFieldMapper(); ParentChildIndexFieldData parentChildIndexFieldData = SearchContext.current().fieldData() .getForField(parentFieldMapper); Filter rawParentFilter = new TermFilter(new Term(TypeFieldMapper.NAME, "parent")); Filter rawFilterMe = new NotFilter(new TermFilter(new Term("filter", "me"))); int max = numUniqueChildValues / 4; for (int i = 0; i < max; i++) { // Randomly pick a cached version: there is specific logic inside ChildrenQuery that deals with the fact // that deletes are applied at the top level when filters are cached. Filter parentFilter; if (random().nextBoolean()) { parentFilter = SearchContext.current().filterCache().cache(rawParentFilter); } else { parentFilter = rawParentFilter; } // Using this in FQ, will invoke / test the Scorer#advance(..) and also let the Weight#scorer not get live docs as acceptedDocs Filter filterMe; if (random().nextBoolean()) { filterMe = SearchContext.current().filterCache().cache(rawFilterMe); } else { filterMe = rawFilterMe; } // Simulate a parent update if (random().nextBoolean()) { int numberOfUpdates = 1 + random().nextInt(TEST_NIGHTLY ? 25 : 5); for (int j = 0; j < numberOfUpdates; j++) { int parentId; do { parentId = random().nextInt(numParentDocs); } while (filteredOrDeletedDocs.contains(parentId)); String parentUid = Uid.createUid("parent", Integer.toString(parentId)); indexWriter.deleteDocuments(new Term(UidFieldMapper.NAME, parentUid)); Document document = new Document(); document.add(new StringField(UidFieldMapper.NAME, parentUid, Field.Store.YES)); document.add(new StringField(TypeFieldMapper.NAME, "parent", Field.Store.NO)); indexWriter.addDocument(document); } indexReader.close(); indexReader = DirectoryReader.open(indexWriter.w, true); searcher = new IndexSearcher(indexReader); engineSearcher = new Engine.SimpleSearcher(ChildrenConstantScoreQueryTests.class.getSimpleName(), searcher); ((TestSearchContext) SearchContext.current()) .setSearcher(new ContextIndexSearcher(SearchContext.current(), engineSearcher)); } String childValue = childValues[random().nextInt(numUniqueChildValues)]; Query childQuery = new ConstantScoreQuery(new TermQuery(new Term("field1", childValue))); int shortCircuitParentDocSet = random().nextInt(numParentDocs); ScoreType scoreType = ScoreType.values()[random().nextInt(ScoreType.values().length)]; Filter nonNestedDocsFilter = random().nextBoolean() ? NonNestedDocsFilter.INSTANCE : null; Query query = new ChildrenQuery(parentChildIndexFieldData, "parent", "child", parentFilter, childQuery, scoreType, shortCircuitParentDocSet, nonNestedDocsFilter); query = new XFilteredQuery(query, filterMe); BitSetCollector collector = new BitSetCollector(indexReader.maxDoc()); int numHits = 1 + random().nextInt(25); TopScoreDocCollector actualTopDocsCollector = TopScoreDocCollector.create(numHits, false); searcher.search(query, MultiCollector.wrap(collector, actualTopDocsCollector)); FixedBitSet actualResult = collector.getResult(); FixedBitSet expectedResult = new FixedBitSet(indexReader.maxDoc()); MockScorer mockScorer = new MockScorer(scoreType); TopScoreDocCollector expectedTopDocsCollector = TopScoreDocCollector.create(numHits, false); expectedTopDocsCollector.setScorer(mockScorer); if (childValueToParentIds.containsKey(childValue)) { AtomicReader slowAtomicReader = SlowCompositeReaderWrapper.wrap(indexReader); Terms terms = slowAtomicReader.terms(UidFieldMapper.NAME); if (terms != null) { NavigableMap<String, FloatArrayList> parentIdToChildScores = childValueToParentIds.lget(); TermsEnum termsEnum = terms.iterator(null); DocsEnum docsEnum = null; for (Map.Entry<String, FloatArrayList> entry : parentIdToChildScores.entrySet()) { TermsEnum.SeekStatus seekStatus = termsEnum .seekCeil(Uid.createUidAsBytes("parent", entry.getKey())); if (seekStatus == TermsEnum.SeekStatus.FOUND) { docsEnum = termsEnum.docs(slowAtomicReader.getLiveDocs(), docsEnum, DocsEnum.FLAG_NONE); expectedResult.set(docsEnum.nextDoc()); mockScorer.scores = entry.getValue(); expectedTopDocsCollector.collect(docsEnum.docID()); } else if (seekStatus == TermsEnum.SeekStatus.END) { break; } } } } assertBitSet(actualResult, expectedResult, searcher); assertTopDocs(actualTopDocsCollector.topDocs(), expectedTopDocsCollector.topDocs()); } indexWriter.close(); indexReader.close(); directory.close(); }
From source file:org.elasticsearch.index.search.child.ParentQueryTests.java
License:Apache License
@Test public void testRandom() throws Exception { Directory directory = newDirectory(); RandomIndexWriter indexWriter = new RandomIndexWriter(random(), directory); int numUniqueParentValues = 1 + random().nextInt(TEST_NIGHTLY ? 6000 : 600); String[] parentValues = new String[numUniqueParentValues]; for (int i = 0; i < numUniqueParentValues; i++) { parentValues[i] = Integer.toString(i); }//from w w w .ja v a 2 s . co m int childDocId = 0; int numParentDocs = 1 + random().nextInt(TEST_NIGHTLY ? 20000 : 1000); ObjectObjectOpenHashMap<String, NavigableMap<String, Float>> parentValueToChildIds = new ObjectObjectOpenHashMap<String, NavigableMap<String, Float>>(); IntIntOpenHashMap childIdToParentId = new IntIntOpenHashMap(); for (int parentDocId = 0; parentDocId < numParentDocs; parentDocId++) { boolean markParentAsDeleted = rarely(); String parentValue = parentValues[random().nextInt(parentValues.length)]; String parent = Integer.toString(parentDocId); Document document = new Document(); document.add(new StringField(UidFieldMapper.NAME, Uid.createUid("parent", parent), Field.Store.NO)); document.add(new StringField(TypeFieldMapper.NAME, "parent", Field.Store.NO)); document.add(new StringField("field1", parentValue, Field.Store.NO)); if (markParentAsDeleted) { document.add(new StringField("delete", "me", Field.Store.NO)); } indexWriter.addDocument(document); int numChildDocs; if (rarely()) { numChildDocs = random().nextInt(TEST_NIGHTLY ? 100 : 25); } else { numChildDocs = random().nextInt(TEST_NIGHTLY ? 40 : 10); } if (parentDocId == numParentDocs - 1 && childIdToParentId.isEmpty()) { // ensure there is at least one child in the index numChildDocs = Math.max(1, numChildDocs); } for (int i = 0; i < numChildDocs; i++) { String child = Integer.toString(childDocId++); boolean markChildAsDeleted = rarely(); boolean filterMe = rarely(); document = new Document(); document.add(new StringField(UidFieldMapper.NAME, Uid.createUid("child", child), Field.Store.YES)); document.add(new StringField(TypeFieldMapper.NAME, "child", Field.Store.NO)); document.add( new StringField(ParentFieldMapper.NAME, Uid.createUid("parent", parent), Field.Store.NO)); if (markChildAsDeleted) { document.add(new StringField("delete", "me", Field.Store.NO)); } if (filterMe) { document.add(new StringField("filter", "me", Field.Store.NO)); } indexWriter.addDocument(document); if (!markParentAsDeleted) { NavigableMap<String, Float> childIdToScore; if (parentValueToChildIds.containsKey(parentValue)) { childIdToScore = parentValueToChildIds.lget(); } else { parentValueToChildIds.put(parentValue, childIdToScore = new TreeMap<String, Float>()); } if (!markChildAsDeleted && !filterMe) { assertFalse("child [" + child + "] already has a score", childIdToScore.containsKey(child)); childIdToScore.put(child, 1f); childIdToParentId.put(Integer.valueOf(child), parentDocId); } } } } // Delete docs that are marked to be deleted. indexWriter.deleteDocuments(new Term("delete", "me")); indexWriter.commit(); IndexReader indexReader = DirectoryReader.open(directory); IndexSearcher searcher = new IndexSearcher(indexReader); Engine.Searcher engineSearcher = new Engine.SimpleSearcher(ParentQueryTests.class.getSimpleName(), searcher); ((TestSearchContext) SearchContext.current()) .setSearcher(new ContextIndexSearcher(SearchContext.current(), engineSearcher)); ParentFieldMapper parentFieldMapper = SearchContext.current().mapperService().documentMapper("child") .parentFieldMapper(); ParentChildIndexFieldData parentChildIndexFieldData = SearchContext.current().fieldData() .getForField(parentFieldMapper); TermFilter rawChildrenFilter = new TermFilter(new Term(TypeFieldMapper.NAME, "child")); Filter rawFilterMe = new NotFilter(new TermFilter(new Term("filter", "me"))); int max = numUniqueParentValues / 4; for (int i = 0; i < max; i++) { // Randomly pick a cached version: there is specific logic inside ChildrenQuery that deals with the fact // that deletes are applied at the top level when filters are cached. Filter childrenFilter; if (random().nextBoolean()) { childrenFilter = SearchContext.current().filterCache().cache(rawChildrenFilter); } else { childrenFilter = rawChildrenFilter; } // Using this in FQ, will invoke / test the Scorer#advance(..) and also let the Weight#scorer not get live docs as acceptedDocs Filter filterMe; if (random().nextBoolean()) { filterMe = SearchContext.current().filterCache().cache(rawFilterMe); } else { filterMe = rawFilterMe; } // Simulate a child update if (random().nextBoolean()) { int numberOfUpdates = 1 + random().nextInt(TEST_NIGHTLY ? 25 : 5); int[] childIds = childIdToParentId.keys().toArray(); for (int j = 0; j < numberOfUpdates; j++) { int childId = childIds[random().nextInt(childIds.length)]; String childUid = Uid.createUid("child", Integer.toString(childId)); indexWriter.deleteDocuments(new Term(UidFieldMapper.NAME, childUid)); Document document = new Document(); document.add(new StringField(UidFieldMapper.NAME, childUid, Field.Store.YES)); document.add(new StringField(TypeFieldMapper.NAME, "child", Field.Store.NO)); String parentUid = Uid.createUid("parent", Integer.toString(childIdToParentId.get(childId))); document.add(new StringField(ParentFieldMapper.NAME, parentUid, Field.Store.NO)); indexWriter.addDocument(document); } indexReader.close(); indexReader = DirectoryReader.open(indexWriter.w, true); searcher = new IndexSearcher(indexReader); engineSearcher = new Engine.SimpleSearcher(ParentConstantScoreQueryTests.class.getSimpleName(), searcher); ((TestSearchContext) SearchContext.current()) .setSearcher(new ContextIndexSearcher(SearchContext.current(), engineSearcher)); } String parentValue = parentValues[random().nextInt(numUniqueParentValues)]; Query parentQuery = new ConstantScoreQuery(new TermQuery(new Term("field1", parentValue))); Query query = new ParentQuery(parentChildIndexFieldData, parentQuery, "parent", childrenFilter); query = new XFilteredQuery(query, filterMe); BitSetCollector collector = new BitSetCollector(indexReader.maxDoc()); int numHits = 1 + random().nextInt(25); TopScoreDocCollector actualTopDocsCollector = TopScoreDocCollector.create(numHits, false); searcher.search(query, MultiCollector.wrap(collector, actualTopDocsCollector)); FixedBitSet actualResult = collector.getResult(); FixedBitSet expectedResult = new FixedBitSet(indexReader.maxDoc()); MockScorer mockScorer = new MockScorer(ScoreType.MAX); // just save one score per parent... mockScorer.scores = new FloatArrayList(); TopScoreDocCollector expectedTopDocsCollector = TopScoreDocCollector.create(numHits, false); expectedTopDocsCollector.setScorer(mockScorer); if (parentValueToChildIds.containsKey(parentValue)) { AtomicReader slowAtomicReader = SlowCompositeReaderWrapper.wrap(indexReader); Terms terms = slowAtomicReader.terms(UidFieldMapper.NAME); if (terms != null) { NavigableMap<String, Float> childIdsAndScore = parentValueToChildIds.lget(); TermsEnum termsEnum = terms.iterator(null); DocsEnum docsEnum = null; for (Map.Entry<String, Float> entry : childIdsAndScore.entrySet()) { TermsEnum.SeekStatus seekStatus = termsEnum .seekCeil(Uid.createUidAsBytes("child", entry.getKey())); if (seekStatus == TermsEnum.SeekStatus.FOUND) { docsEnum = termsEnum.docs(slowAtomicReader.getLiveDocs(), docsEnum, DocsEnum.FLAG_NONE); expectedResult.set(docsEnum.nextDoc()); mockScorer.scores.add(entry.getValue()); expectedTopDocsCollector.collect(docsEnum.docID()); mockScorer.scores.clear(); } else if (seekStatus == TermsEnum.SeekStatus.END) { break; } } } } assertBitSet(actualResult, expectedResult, searcher); assertTopDocs(actualTopDocsCollector.topDocs(), expectedTopDocsCollector.topDocs()); } indexWriter.close(); indexReader.close(); directory.close(); }
From source file:org.elasticsearch.search.aggregations.bucket.tophits.TopHitsAggregator.java
License:Apache License
@Override public void collect(int docId, long bucketOrdinal) throws IOException { TopDocsCollector topDocsCollector = topDocsCollectors.get(bucketOrdinal); if (topDocsCollector == null) { Sort sort = topHitsContext.sort(); int topN = topHitsContext.from() + topHitsContext.size(); topDocsCollectors.put(bucketOrdinal, topDocsCollector = sort != null ? TopFieldCollector.create(sort, topN, true, topHitsContext.trackScores(), true, false) : TopScoreDocCollector.create(topN, false)); topDocsCollector.setNextReader(currentContext); topDocsCollector.setScorer(currentScorer); }/* w w w . j a v a 2s . c om*/ topDocsCollector.collect(docId); }
From source file:org.hibernate.search.query.engine.impl.QueryHits.java
License:Open Source License
private TopDocsCollector<?> createTopDocCollector(int maxDocs, Weight weight) throws IOException { TopDocsCollector<?> topCollector; if (sort == null) { topCollector = TopScoreDocCollector.create(maxDocs, !weight.scoresDocsOutOfOrder()); } else {// ww w .java 2 s .co m boolean fillFields = true; topCollector = TopFieldCollector.create(sort, maxDocs, fillFields, searcher.isFieldSortDoTrackScores(), searcher.isFieldSortDoMaxScore(), !weight.scoresDocsOutOfOrder()); } return topCollector; }