2010/10/20 Balazs E. Pataki <pat...@dsd.sztaki.hu>

> Hi Andrés,
>
> I just quickly read through the code and have an idea for an additional
> sorting solution via QueryContext: a user provided sorter, which is
> invoked right after lucene search has been executed, but before the
> lucene results are turned into neo4j Nodes. This would give developers
> the option to sort lucene Documents according to their fields using
> whatever sorting method they want. The code below is just theoretical, I
> haven't tried it yet, but would require just minimal additions to the
> current LucenIndex#search() method and to QueryContext.
>
> This is the current search() method in  LuceneIndex.java:
>
> private SearchResult search( IndexSearcherRef searcher, Query query,
>     QueryContext additionalParametersOrNull )
> {
>   try
>   {
>     searcher.incRef();
>     Sort sorting = additionalParametersOrNull != null ?
>         additionalParametersOrNull.sorting : null;
>     Hits hits = new Hits( searcher.getSearcher(), query, null, sorting );
>     return new SearchResult( new HitsIterator( hits ), hits.length() );
>   }
>   catch ( IOException e )
>   {
>     throw new RuntimeException( "Unable to query " + this + " with "
>                   + query, e );
>   }
> }
>
> I would add two things: a SortingIterator interface and a
> sortingIterator field to QueryContext:
>
> public interface SortingIterator extends Iterator<Document>{
>   public void setIterator(Iterator<Document> hitIterator);
>   public itn length();
> }
>
> public class QueryContext
> {
>   final Object queryOrQueryObject;
>   Sort sorting;
>   SortingIterator sortingIterator;
>   Operator defaultOperator;
>   boolean tradeCorrectnessForSpeed;
>   ...
> }
>
> And would add these to search(): if "sorting" is available, it would be
> passed as usual to the constructor of Hits(), and then if a
> "sortingIterator" is set in the QueryContext we could pass it the
> original HitsIterator (via setIterator()) and access the results via the
> "sortingIterator" rather than the HitsIterator directly:
>
>
> private SearchResult search( IndexSearcherRef searcher, Query query,
>     QueryContext additionalParametersOrNull )
> {
>   try
>   {
>     searcher.incRef();
>     Sort sorting = additionalParametersOrNull != null ?
>         additionalParametersOrNull.sorting : null;
>     SortingIterator sortingIterator = additionalParametersOrNull != null ?
>         additionalParametersOrNull.sortingIterator : null;
>     Hits hits = new Hits( searcher.getSearcher(), query, null, sorting );
>     Iterator<Document> hitIterator =  new HitsIterator( hits );
>     int hitLength = hits.length();
>     if (sortingIterator != null) {
>       hitIterator = sortingIterator.setIterator(hitIterator);
>       hitLength = sortingIterator.length();
>     }
>     return new SearchResult( hitIterator, hitLength );
>   }
>   catch ( IOException e )
>   {
>     throw new RuntimeException( "Unable to query " + this + " with "
>                   + query, e );
>   }
> }
>
> The SortingIterator could fetch the lucene Documents via the iterator
> passed in setIterator(), possibly fetching the Documents and sorting
> using whatever method it wants based on whichever fields are available
> in the Documents. Then would provide the sorted result back via next().
> Also this intermediate iterator could do other things with the result,
> eg. remove some Documents, etc. (that's why it provides its own length()
> for the result list)
>
> Do you think such solution is feasible?
>

Sure, something like that could be implemented. The point would be to be
able to control the order yourself, I assume? Because I'm guessing it'd be
hard to implement something that would be more efficient than the internal
Sort stuff in Lucene, however the options are quite limited there... you can
just specify which keys to sort on and the order is always the natural
lexical order, I think.

Good input.


>
> Regards,
> ---
> balazs
>
>
> On 10/20/10 8:24 AM, Balazs E. Pataki wrote:
> > Hi Andrés,
> >
> > Thanks for the answer, looks cool :-)
> >
> > I give it a try immediately!
> >
> > Regards,
> > ---
> > balazs
> >
> >
> >
> > On 10/19/10 8:37 PM, Mattias Persson wrote:
> >> 2010/10/19 Andres Taylor<andres.tay...@neotechnology.com>
> >>
> >>> Hi Balazs,
> >>>
> >>> We've been working on a new lucene-index module just these last days.
> The
> >>> new index module allows sorting, through the QueryContext-class. You
> can
> >>> look in svn<https://svn.neo4j.org/components/lucene-index/trunk/>, if
> you
> >>> are so inclined, or wait for the next milestone release (Thursday).
> >>>
> >>
> >> Exactly, an example could be:
> >>
> >>      Index<Node>   myNodeIndex = ...
> >>      for ( Node hit : myNodeIndex.query(
> >>         new QueryContext( "name:Balazs" ).sort( "name" ) ) ) {
> >>             System.out.println( hit.getProperty( "name" ) );
> >>      }
> >>
> >>
> >>> HTH,
> >>>
> >>> Andrés
> >>>
> >>> On Tue, Oct 19, 2010 at 5:41 PM, Balazs E. Pataki<pat...@dsd.sztaki.hu
> >>>> wrote:
> >>>
> >>>> Hi,
> >>>>
> >>>> Is it possible to do get sorted results form LuceneIndex#query()?
> >>>>
> >>>> It would be really helpful if results would be sorted at "lucene time"
> >>>> according to one or more indexed fields rather than loading the actual
> >>>> neo4j nodes and than iterating over them for sorting.
> >>>>
> >>>> Currently, it seems that sorting is not supported by LuceneIndex, but
> >>>> are there plans regarding this?
> >>>>
> >>>> Thanks for any hints,
> >>>> ---
> >>>> balazs
> >>>> _______________________________________________
> >>>> Neo4j mailing list
> >>>> User@lists.neo4j.org
> >>>> https://lists.neo4j.org/mailman/listinfo/user
> >>>>
> >>> _______________________________________________
> >>> Neo4j mailing list
> >>> User@lists.neo4j.org
> >>> https://lists.neo4j.org/mailman/listinfo/user
> >>>
> >>
> >>
> >>
> > _______________________________________________
> > Neo4j mailing list
> > User@lists.neo4j.org
> > https://lists.neo4j.org/mailman/listinfo/user
> _______________________________________________
> Neo4j mailing list
> User@lists.neo4j.org
> https://lists.neo4j.org/mailman/listinfo/user
>



-- 
Mattias Persson, [matt...@neotechnology.com]
Hacker, Neo Technology
www.neotechnology.com
_______________________________________________
Neo4j mailing list
User@lists.neo4j.org
https://lists.neo4j.org/mailman/listinfo/user

Reply via email to