【问题标题】:Lucene.NET - sorting by intLucene.NET - 按 int 排序
【发布时间】:2010-04-21 18:21:06
【问题描述】:

在最新版本的 Lucene(或 Lucene.NET)中,以排序顺序返回搜索结果的正确方法是什么?

我有这样的文件:

var document = new Lucene.Document();
document.AddField("Text", "foobar");
document.AddField("CreationDate", DateTime.Now.Ticks.ToString()); // store the date as an int

indexWriter.AddDocument(document);

现在我想进行搜索并按最近的顺序返回我的结果。

如何进行按 CreationDate 排序的搜索?我看到的所有文档都是针对使用现已弃用的 API 的旧 Lucene 版本。

【问题讨论】:

    标签: sorting lucene lucene.net


    【解决方案1】:

    在对 API 进行了一些研究和探索之后,我终于找到了一些未弃用的 API(从 v2.9 和 v3.0 开始),它们可以让您按日期订购:

    // Find all docs whose .Text contains "hello", ordered by .CreationDate.
    var query = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "Text", new StandardAnalyzer()).Parse("hello");
    var indexDirectory = FSDirectory.Open(new DirectoryInfo("c:\\foo"));
    var searcher = new IndexSearcher(indexDirectory, true);
    try
    {
       var sort = new Sort(new SortField("CreationDate", SortField.LONG));
       var filter =  new QueryWrapperFilter(query);
       var results = searcher.Search(query, , 1000, sort);
       foreach (var hit in results.scoreDocs)
       {
           Document document = searcher.Doc(hit.doc);
           Console.WriteLine("\tFound match: {0}", document.Get("Text"));
       }
    }
    finally
    {
       searcher.Close();
    }
    

    请注意,我正在使用 LONG 比较对创建日期进行排序。那是因为我将创建日期存储为 DateTime.Now.Ticks,它是一个 System.Int64,或 C# 中的 long。

    【讨论】:

    • 我发现的第一个可理解的 Lucene 排序解决方案
    • 我认为您在 searcher.Search() 方法调用中缺少过滤器的空值...
    • 链接到您找到对您有帮助的信息的来源。
    • @AndreasNiedermair:已修复。
    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多