Example usage for org.apache.lucene.search TopScoreDocCollector create

List of usage examples for org.apache.lucene.search TopScoreDocCollector create

Introduction

In this page you can find the example usage for org.apache.lucene.search TopScoreDocCollector create.

Prototype

public static TopScoreDocCollector create(int numHits, int totalHitsThreshold) 

Source Link

Document

Creates a new TopScoreDocCollector given the number of hits to collect and the number of hits to count accurately.

Usage

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;
}