Lucene.Net: How can I add a date filter to my search results?

前端 未结 2 373
清歌不尽
清歌不尽 2020-12-30 13:06

I\'ve got my searcher working really well, however it does tend to return results that are obsolete. My site is much like NerdDinner whereby events in the past become irrel

2条回答
  •  南方客
    南方客 (楼主)
    2020-12-30 14:05

    You can combine multiple queries with a BooleanQuery. Since Lucene only searches text note that the date field in your index must be ordered by the most significant to the least significant part of the date, i.e. in IS8601 format ("2010-11-02T20:49:16.000000+00:00")

    Example:

    Lucene.Net.Index.Term searchTerm = new Lucene.Net.Index.Term("fullText", searchTerms);
    Lucene.Net.Index.Term dateRange = new Lucene.Net.Index.Term("date", "2010*");
    
    Lucene.Net.Search.Query termQuery = new Lucene.Net.Search.TermQuery(searchTerm);
    Lucene.Net.Search.Query dateRangeQuery = new Lucene.Net.Search.WildcardQuery(dateRange);
    
    Lucene.Net.Search.BooleanQuery query = new Lucene.Net.Search.BooleanQuery();
    query.Add(termQuery, BooleanClause.Occur.MUST);
    query.Add(dateRangeQuery, BooleanClause.Occur.MUST);
    

    Alternatively if a wildcard is not precise enough you can add a RangeQuery instead:

    Lucene.Net.Search.Query termQuery = new Lucene.Net.Search.TermQuery(searchTerm);
    Lucene.Net.Index.Term date1 = new Lucene.Net.Index.Term("date", "2010-11-02*");
    Lucene.Net.Index.Term date2 = new Lucene.Net.Index.Term("date", "2010-11-03*");
    Lucene.Net.Search.Query dateRangeQuery = new Lucene.Net.Search.RangeQuery(date1, date2, true);
    
    Lucene.Net.Search.BooleanQuery query = new Lucene.Net.Search.BooleanQuery();
    query.Add(termQuery, BooleanClause.Occur.MUST);
    query.Add(dateRangeQuery, BooleanClause.Occur.MUST);
    

提交回复
热议问题