我在.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
我有点困惑。有人看到我做错了吗?
答案 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);
所以现在你的问题已经解决了,但我仍然没有得到任何结果。也许是因为对工具本身的误解。无论如何,快乐的小道哥们。