Field Collapsing (lightweight version)
--------------------------------------

                 Key: SOLR-1773
                 URL: https://issues.apache.org/jira/browse/SOLR-1773
             Project: Solr
          Issue Type: New Feature
          Components: search
    Affects Versions: 1.4
            Reporter: Koji Sekiguchi
            Priority: Minor


I'd like to start another approach for field collapsing suggested by Yonik on 
19/Dec/09 at SOLR-236. Re-posting the idea:

{code}
=================== two pass collapsing algorithm for collapse.aggregate=max 
====================
First pass: pretend that collapseCount=1
  - Use a TreeSet as  a priority queue since one can remove and insert entries.
  - A HashMap<Key,TreeSetEntry> will be used to map from collapse group to top 
entry in the TreeSet
  - compare new doc with smallest element in treeset.  If smaller discard and 
go to the next doc.
  - If new doc is bigger, look up it's group.  Use the Map to find if the group 
has been added to the TreeSet and add it if not.
  - If the new bigger doc is already in the TreeSet, compare with the document 
in that group.  If bigger, update the node,
    remove and re-add to the TreeSet to re-sort.

efficiency: the treeset and hashmap are both only the size of the top number of 
docs we are looking at (10 for instance)
We will now have the top 10 documents collapsed by the right field with a 
collapseCount of 1.  Put another way, we have the top 10 groups.

Second pass (if collapseCount>1):
 - create a priority queue for each group (10) of size collapseCount
 - re-execute the query (or if the sort within the collapse groups does not 
involve score, we could just use the docids gathered during phase 1)
 - for each document, find it's appropriate priority queue and insert
 - optimization: we can use the previous info from phase1 to even avoid 
creating a priority queue if no other items matched.

So instead of creating collapse groups for every group in the set (as is done 
now?), we create it for only 10 groups.
Instead of collecting the score for every document in the set (40MB per request 
for a 10M doc index is *big*) we re-execute the query if needed.
We could optionally store the score as is done now... but I bet aggregate 
throughput on large indexes would be better by just re-executing.

Other thought: we could also cache the first phase in the query cache which 
would allow one to quickly move to the 2nd phase for any collapseCount.
{code}

The restriction is:

{quote}
one would not be able to tell the total number of collapsed docs, or the total 
number of hits (or the DocSet) after collapsing. So only collapse.facet=before 
would be supported.
{quote}


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to