Java – Sorting lucene documents by date

javalucene

How I can achieve scoring and sorting in lucene as per the start date.

Event which has latest start date should be shown first in search results. I am using lucene Version.LUCENE_44

I have retreived data from DB and stored in Lucene Document as,

public static Document createDoc(Event e) {
    Document d = new Document();
    //event id
    d.add(new StoredField("id", e.getId()));
    //event name
    d.add(new StoredField("eventname", e.getEName());
    TextField field = new TextField("enameSrch", e.getEName(), Store.NO);
    field.setBoost(10.0f);
    d.add(field);
    //event owner
    d.add(new StoredField("eventowner", e.getEOwner());
    //event start date
    d.add(new LongField("edateSort", Long.MAX_VALUE-e.getEStartTime(), Store.YES)); 
    //event tags    
    if (e.eventTags()!=null) {
        field = new TextField("eTagSrch", e.getTags(), Store.NO);
        field.setBoost(5.0f);
        d.add(field);
        d.add(new StoredField("eTags", e.getTags()));
    }

And while searching I am doing as,

public List search(String srchTxt){
        PhraseQuery enameQuery = new PhraseQuery();
        Term term = new Term("enameSrch", srchTxt.toLowerCase());
        enameQuery .add(term);

        PhraseQuery etagQuery = new PhraseQuery();
        term = new Term("eTagSrch", srchTxt.toLowerCase());
        etagQuery.add(term);

        BooleanQuery b= new BooleanQuery();
        b.add(enameQuery , Occur.SHOULD);
        b.add(etagQuery , Occur.SHOULD);

        SortField startField = new SortField("edateSort", Type.LONG);
        SortField scoreField = SortField.FIELD_SCORE;
        Sort sort = new Sort(scoreField, startField);

         TopFieldDocs tfd = searcher.search(b, 10, sort);
         ScoreDoc[] myscore= tfd.scoreDocs;

To rephrase: I want to sort Documents by date, which is stored as a Long field in my Document (see code above)

Best Answer

What your code does is sorts by score, then by date, since your scores coming back are not likely the same, they will almost always be by score anyways.

This is what I would do:

Sort sorter = new Sort(); // new sort object

String field = "fieldName"; // enter the field to sort by
Type type = Type.Long; // since your field is long type
boolean descending = false; // ascending by default

SortField sortField = new SortField(field, type, descending);

sorter.setSort(sortField); // now set the sort field

This will just sort by the field you specified. You can also do:

sorter.setSort(sortField, SortField.FIELD_SCORE); // this will sort by field, then by score
Related Topic