2014-02-23 50 views
2

如何根据开始日期在lucene中实现评分和排序。按日期排序lucene文档

应在搜索结果中首先显示具有最新开始日期的事件。我使用Lucene Version.LUCENE_44

我从DB retreived数据,并存储在Lucene的文档作为,

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

虽然搜索我做的,

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; 

重新表述:我想按日期排序文档,在我的文档中存储为长字段(请参阅上面的代码)

+0

谁能帮我在这... – user3342280

+0

重新表述您的问题please..little有点难以理解。 – fatih

回答

1

您的代码所做的是按分数排序,然后按日期排序,因为您的分数为com回头看起来不太一样,他们几乎总是会以总分来衡量。

这是我会做:

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 

这只是排序字段指定。你也可以这样做:

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