Search in sources :

Example 1 with Group

use of com.yahoo.search.grouping.result.Group in project vespa by vespa-engine.

the class UniqueGroupingSearcher method dedupe.

/**
 * Until we can use the grouping pagination features in 5.1, we'll have to support offset
 * by simply requesting and discarding hit #0 up to hit #offset.
 */
private static Result dedupe(Query query, Execution execution, String dedupField) {
    Sorting sorting = query.getRanking().getSorting();
    if (sorting != null && sorting.fieldOrders().size() > 1) {
        query.trace("Can not use grouping for deduping with multi-level sorting.", 3);
        // we'd ever want to actually use it (and a bit harder to implement as well).
        return execution.search(query);
    }
    int hits = query.getHits();
    int offset = query.getOffset();
    int groupingHits = hits + offset;
    GroupingRequest groupingRequest = GroupingRequest.newInstance(query);
    groupingRequest.setRootOperation(buildGroupingExpression(dedupField, groupingHits, query.getPresentation().getSummary(), sorting));
    query.setHits(0);
    query.setOffset(0);
    Result result = execution.search(query);
    // query could have changed further down in the chain
    query = result.getQuery();
    query.setHits(hits);
    query.setOffset(offset);
    Group root = groupingRequest.getResultGroup(result);
    if (null == root) {
        String msg = "Result group not found for deduping grouping request, returning empty result.";
        query.trace(msg, 3);
        log.log(LogLevel.WARNING, msg);
        throw new IllegalStateException("Failed to produce deduped result set.");
    }
    // hide our tracks
    result.hits().remove(root.getId().toString());
    GroupList resultGroups = root.getGroupList(dedupField);
    if (resultGroups == null) {
        query.trace("Deduping grouping request returned no hits, returning empty result.", 3);
        return result;
    }
    // Make sure that .addAll() doesn't re-order the hits we copy from the grouping
    // framework. The groups are already in the order they should be.
    result.hits().setOrderer(NOP_ORDERER);
    result.hits().addAll(getRequestedHits(resultGroups, offset, hits));
    Long countField = (Long) root.getField(LABEL_COUNT);
    long count = countField != null ? countField : 0;
    result.setTotalHitCount(count);
    return result;
}
Also used : Group(com.yahoo.search.grouping.result.Group) GroupList(com.yahoo.search.grouping.result.GroupList) Sorting(com.yahoo.search.query.Sorting) Result(com.yahoo.search.Result)

Example 2 with Group

use of com.yahoo.search.grouping.result.Group in project vespa by vespa-engine.

the class GroupingRequestTestCase method requireThatResultIsFound.

@Test
public void requireThatResultIsFound() {
    Query query = new Query();
    GroupingRequest req = GroupingRequest.newInstance(query);
    Result res = new Result(query);
    res.hits().add(new Hit("foo"));
    RootGroup bar = newRootGroup(0);
    req.setResultGroup(bar);
    res.hits().add(bar);
    res.hits().add(new Hit("baz"));
    Group grp = req.getResultGroup(res);
    assertNotNull(grp);
    assertSame(bar, grp);
}
Also used : RootGroup(com.yahoo.search.grouping.result.RootGroup) Group(com.yahoo.search.grouping.result.Group) Hit(com.yahoo.search.result.Hit) Query(com.yahoo.search.Query) RootGroup(com.yahoo.search.grouping.result.RootGroup) Result(com.yahoo.search.Result) Test(org.junit.Test)

Example 3 with Group

use of com.yahoo.search.grouping.result.Group in project vespa by vespa-engine.

the class GroupingRequestTestCase method requireThatParallelRequestsAreSupported.

@Test
public void requireThatParallelRequestsAreSupported() {
    Query query = new Query();
    Result res = new Result(query);
    GroupingRequest reqA = GroupingRequest.newInstance(query);
    RootGroup grpA = newRootGroup(0);
    reqA.setResultGroup(grpA);
    res.hits().add(grpA);
    GroupingRequest reqB = GroupingRequest.newInstance(query);
    RootGroup grpB = newRootGroup(1);
    reqB.setResultGroup(grpB);
    res.hits().add(grpB);
    Group grp = reqA.getResultGroup(res);
    assertNotNull(grp);
    assertSame(grpA, grp);
    assertNotNull(grp = reqB.getResultGroup(res));
    assertSame(grpB, grp);
}
Also used : RootGroup(com.yahoo.search.grouping.result.RootGroup) Group(com.yahoo.search.grouping.result.Group) Query(com.yahoo.search.Query) RootGroup(com.yahoo.search.grouping.result.RootGroup) Result(com.yahoo.search.Result) Test(org.junit.Test)

Example 4 with Group

use of com.yahoo.search.grouping.result.Group in project vespa by vespa-engine.

the class GroupingExecutorTestCase method requireThatHitsAreFilledWithCorrectSummary.

@Test
public void requireThatHitsAreFilledWithCorrectSummary() {
    Query query = newQuery();
    GroupingRequest req = GroupingRequest.newInstance(query);
    req.setRootOperation(GroupingOperation.fromString("all(group(foo) each(each(output(summary(bar))) as(bar) " + "                    each(output(summary(baz))) as(baz)))"));
    Grouping pass0A = new Grouping(0);
    pass0A.setRoot(new com.yahoo.searchlib.aggregation.Group().addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("foo")).addAggregationResult(new HitsAggregationResult(1, "bar"))));
    Grouping pass0B = new Grouping(1);
    pass0B.setRoot(new com.yahoo.searchlib.aggregation.Group().addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("foo")).addAggregationResult(new HitsAggregationResult(1, "baz"))));
    GlobalId gid1 = new GlobalId((new DocumentId("doc:test:1")).getGlobalId());
    GlobalId gid2 = new GlobalId((new DocumentId("doc:test:2")).getGlobalId());
    Grouping pass1A = new Grouping(0);
    pass1A.setRoot(new com.yahoo.searchlib.aggregation.Group().addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("foo")).addAggregationResult(new HitsAggregationResult(1, "bar").addHit(new com.yahoo.searchlib.aggregation.FS4Hit(1, gid1, 3)))));
    Grouping pass1B = new Grouping(1);
    pass1B.setRoot(new com.yahoo.searchlib.aggregation.Group().addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("foo")).addAggregationResult(new HitsAggregationResult(1, "baz").addHit(new com.yahoo.searchlib.aggregation.FS4Hit(4, gid2, 6)))));
    SummaryMapper sm = new SummaryMapper();
    Execution exec = newExecution(new GroupingExecutor(), new ResultProvider(Arrays.asList(new GroupingListHit(Arrays.asList(pass0A, pass0B), null), new GroupingListHit(Arrays.asList(pass1A, pass1B), null))), sm);
    exec.fill(exec.search(query), "default");
    assertEquals(2, sm.hitsBySummary.size());
    List<Hit> lst = sm.hitsBySummary.get("bar");
    assertNotNull(lst);
    assertEquals(1, lst.size());
    Hit hit = lst.get(0);
    assertTrue(hit instanceof FastHit);
    assertEquals(1, ((FastHit) hit).getPartId());
    assertEquals(gid1, ((FastHit) hit).getGlobalId());
    assertNotNull(lst = sm.hitsBySummary.get("baz"));
    assertNotNull(lst);
    assertEquals(1, lst.size());
    hit = lst.get(0);
    assertTrue(hit instanceof FastHit);
    assertEquals(4, ((FastHit) hit).getPartId());
    assertEquals(gid2, ((FastHit) hit).getGlobalId());
}
Also used : Group(com.yahoo.search.grouping.result.Group) Query(com.yahoo.search.Query) DocumentId(com.yahoo.document.DocumentId) Grouping(com.yahoo.searchlib.aggregation.Grouping) GlobalId(com.yahoo.document.GlobalId) GroupingListHit(com.yahoo.prelude.fastsearch.GroupingListHit) HitsAggregationResult(com.yahoo.searchlib.aggregation.HitsAggregationResult) GroupingListHit(com.yahoo.prelude.fastsearch.GroupingListHit) FastHit(com.yahoo.prelude.fastsearch.FastHit) Hit(com.yahoo.search.result.Hit) Execution(com.yahoo.search.searchchain.Execution) FastHit(com.yahoo.prelude.fastsearch.FastHit) GroupingRequest(com.yahoo.search.grouping.GroupingRequest) StringResultNode(com.yahoo.searchlib.expression.StringResultNode) Test(org.junit.Test)

Example 5 with Group

use of com.yahoo.search.grouping.result.Group in project vespa by vespa-engine.

the class GroupingExecutorTestCase method requireThatHitsAreAttachedToCorrectQuery.

@Test
public void requireThatHitsAreAttachedToCorrectQuery() {
    Query queryA = newQuery();
    GroupingRequest req = GroupingRequest.newInstance(queryA);
    req.setRootOperation(GroupingOperation.fromString("all(group(foo) each(each(output(summary(bar)))))"));
    Grouping grp = new Grouping(0);
    grp.setRoot(new com.yahoo.searchlib.aggregation.Group().addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("foo")).addAggregationResult(new HitsAggregationResult(1, "bar"))));
    GroupingListHit pass0 = new GroupingListHit(Arrays.asList(grp), null);
    GlobalId gid = new GlobalId((new DocumentId("doc:test:1")).getGlobalId());
    grp = new Grouping(0);
    grp.setRoot(new com.yahoo.searchlib.aggregation.Group().addChild(new com.yahoo.searchlib.aggregation.Group().setId(new StringResultNode("foo")).addAggregationResult(new HitsAggregationResult(1, "bar").addHit(new com.yahoo.searchlib.aggregation.FS4Hit(4, gid, 6)))));
    GroupingListHit pass1 = new GroupingListHit(Arrays.asList(grp), null);
    Query queryB = newQuery();
    /**
     * required by {@link GroupingListHit#getSearchQuery()}
     */
    pass1.setQuery(queryB);
    QueryMapper qm = new QueryMapper();
    Execution exec = newExecution(new GroupingExecutor(), new ResultProvider(Arrays.asList(pass0, pass1)), qm);
    exec.fill(exec.search(queryA));
    assertEquals(1, qm.hitsByQuery.size());
    assertTrue(qm.hitsByQuery.containsKey(queryB));
}
Also used : Group(com.yahoo.search.grouping.result.Group) Query(com.yahoo.search.Query) DocumentId(com.yahoo.document.DocumentId) Grouping(com.yahoo.searchlib.aggregation.Grouping) GroupingListHit(com.yahoo.prelude.fastsearch.GroupingListHit) GlobalId(com.yahoo.document.GlobalId) HitsAggregationResult(com.yahoo.searchlib.aggregation.HitsAggregationResult) Execution(com.yahoo.search.searchchain.Execution) GroupingRequest(com.yahoo.search.grouping.GroupingRequest) StringResultNode(com.yahoo.searchlib.expression.StringResultNode) Test(org.junit.Test)

Aggregations

Group (com.yahoo.search.grouping.result.Group)17 Test (org.junit.Test)13 Query (com.yahoo.search.Query)11 Result (com.yahoo.search.Result)10 GroupingListHit (com.yahoo.prelude.fastsearch.GroupingListHit)9 GroupingRequest (com.yahoo.search.grouping.GroupingRequest)9 GroupList (com.yahoo.search.grouping.result.GroupList)9 Grouping (com.yahoo.searchlib.aggregation.Grouping)9 StringResultNode (com.yahoo.searchlib.expression.StringResultNode)9 Hit (com.yahoo.search.result.Hit)8 Execution (com.yahoo.search.searchchain.Execution)8 HitsAggregationResult (com.yahoo.searchlib.aggregation.HitsAggregationResult)7 MaxAggregationResult (com.yahoo.searchlib.aggregation.MaxAggregationResult)7 RootGroup (com.yahoo.search.grouping.result.RootGroup)6 MinAggregationResult (com.yahoo.searchlib.aggregation.MinAggregationResult)6 CountAggregationResult (com.yahoo.searchlib.aggregation.CountAggregationResult)5 FastHit (com.yahoo.prelude.fastsearch.FastHit)4 Relevance (com.yahoo.search.result.Relevance)4 HitList (com.yahoo.search.grouping.result.HitList)3 StringId (com.yahoo.search.grouping.result.StringId)3