【问题标题】:Sorting lucene documents by date按日期对 lucene 文档进行排序
【发布时间】:2014-02-23 02:49:21
【问题描述】:

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

最晚开始日期的活动应首先显示在搜索结果中。我正在使用 lucene Version.LUCENE_44

我已从数据库中检索数据并存储在 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;

换种说法:我想按日期对文档进行排序,该日期作为长字段存储在我的文档中(参见上面的代码)

【问题讨论】:

  • 谁能帮我解决这个问题...
  • 请改写你的问题..有点难以理解。

标签: java lucene


【解决方案1】:

您的代码所做的是按分数排序,然后按日期排序,因为返回的分数不太可能相同,无论如何它们几乎总是按分数排序。

这就是我会做的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2020-10-30
    • 2020-03-26
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多