Lucene数字范围查询返回无结果/意外结果

时间:2014-06-25 03:07:36

标签: lucene.net

我在.NET 4.5上使用Lucene .NET v3。我不确定为什么我的查询结果不正确。这是一个简单的测试应用程序:

static class Program
{
    static Document MakeDocument(String rcaName, int statusCode)
    {
        var doc = new Document();

        doc.Add(new Field("RCAName", rcaName, Field.Store.YES, Field.Index.NO));
        doc.Add(new Field("ActionId", Guid.NewGuid().ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));

        var status = new NumericField("Status", Field.Store.YES, true);
        status.SetLongValue(statusCode);
        doc.Add(status);

        return doc;
    }

    static void Main()
    {
        var dir = new SimpleFSDirectory(new DirectoryInfo("C:/Sologic/temp/bsindex"));
        // var analyzer = new SologicAnalyzer() { StopWords = StopAnalyzer.ENGLISH_STOP_WORDS_SET };
        var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);

        using (var writer = new Lucene.Net.Index.IndexWriter(dir, analyzer, true, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED))
        {
            writer.AddDocument(MakeDocument("RCA 1", 2));
            writer.AddDocument(MakeDocument("RCA 2", 4));
            writer.AddDocument(MakeDocument("RCA 3", 2));
            writer.AddDocument(MakeDocument("RCA 4", 4));
        }

        var searcher = new Lucene.Net.Search.IndexSearcher(IndexReader.Open(dir, true));
        var query = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Status", analyzer).Parse("2");

        var hits = searcher.Search(query, 100);

        Console.WriteLine(hits.TotalHits);
        Console.Read();
    }
}

当我用luke打开索引时,我运行以下查询:

Status:[2 TO 2] - 0
Status:[4 TO 4] - 0
Status:[0 TO 4] - 4
Status:[0 TO 2] - 4
Status:[0 TO 0] - 0

我有点困惑。有人看到我做错了吗?

1 个答案:

答案 0 :(得分:0)

两件事:

A。)您正在使用int设置long值。我猜这可能导致一些不稳定的事故发生在下面。停止这样做。

status.SetLongValue(statusCode);

变为

status.SetIntValue(statusCode);

B。)不要解析字符串以获得int。基本上QueryParser在这里是错误的选择。你在哪里:

var query = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Status", analyzer).Parse("2");

你需要

var query = NumericRangeQuery.NewIntRange("Status", 4, 4, true, true);

所以现在你的问题已经解决了,但我仍然没有得到任何结果。也许是因为对工具本身的误解。无论如何,快乐的小道哥们。