我開始使用Lucene.Net 4.8演示項目(https://github.com/synhershko/LuceneNetDemo)。我的目標是能夠使用查詢解析器(QueryParser或MultiFieldQueryParser)來搜索文本以及數字。那可能嗎?我找到的所有例子都是使用範圍(NumericRangeQuery),或者是建立我自己的查詢解析器的建議。我無法確定是否可以通過現有的查詢解析器創建範圍?可以Lucene.Net(3.0.3或4.8.0)QueryParser搜索數字嗎?
using System;
using Lucene.Net.Store;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Util;
using Lucene.Net.QueryParsers.Classic;
using Lucene.Net.Search;
using Lucene.Net.Analysis.Standard;
/*
Package Manager:
Install-Package Lucene.Net -Version 4.8.0-beta00004 -Pre
Install-Package Lucene.Net.Analysis.Common -Version 4.8.0-beta00004 -Pre
Install-Package Lucene.Net.QueryParser -Version 4.8.0-beta00004 -Pre
*/
namespace LuceneNetNumbers
{
class Program
{
static void Main(string[] args)
{
LuceneVersion MatchVersion = LuceneVersion.LUCENE_48;
using (var oDirectory = new RAMDirectory())
{
var oAnalyzer = new StandardAnalyzer(MatchVersion);
var oQueryParser = new MultiFieldQueryParser(MatchVersion, new[] { "name", "height", "age" }, oAnalyzer);
var oIndexWriterConfig = new IndexWriterConfig(MatchVersion, oAnalyzer);
var oIndexWriter = new IndexWriter(oDirectory, oIndexWriterConfig);
var oSearcherManager = new SearcherManager(oIndexWriter, true, null);
var oAdd = new Action<string, double, int>((sName, nAge, nHeight) =>
{
var oDocument = new Document
{
new TextField("name", sName, Field.Store.YES),
new Int32Field("height", nHeight, Field.Store.YES),
new DoubleField("age", nAge, Field.Store.YES),
};
oIndexWriter.UpdateDocument(new Term("name", sName), oDocument);
});
oAdd("John Doe", 24.45, 56);
oAdd("John Smith", 44.44, 64);
oAdd("Mike Smith", 56.65, 70);
oIndexWriter.Flush(true, true);
oIndexWriter.Commit();
//
var oSearch = new Action<string>((sQueryString) =>
{
var oQuery = oQueryParser.Parse(sQueryString);
oSearcherManager.MaybeRefreshBlocking();
var oSearcher = oSearcherManager.Acquire();
try
{
var oTopDocs = oSearcher.Search(oQuery, 10);
var nTotalHits = oTopDocs.TotalHits;
Console.WriteLine("Total Hits: {0}", nTotalHits);
foreach (var oResult in oTopDocs.ScoreDocs)
{
var oDocument = oSearcher.Doc(oResult.Doc);
var nScore = oResult.Score;
var sName = oDocument.GetField("name")?.GetStringValue();
var nAge = oDocument.GetField("age")?.GetNumericValue();
var nHeight = oDocument.GetField("height")?.GetNumericValue();
Console.WriteLine("{0:0.00}, {1,15}, {2,8}, {3,8}", nScore, sName, nAge, nHeight);
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
oSearcherManager.Release(oSearcher);
oSearcher = null;
}
});
oSearch("john");
oSearch("height:64");
/*
Output:
Total Hits: 2
0.20, John Doe, 24.45, 56
0.20, John Smith, 44.44, 64
Total Hits: 0
*/
}
}
}
}
如果你只是搜索'64',我希望它會返回你一擊。 –
不幸的是,它返回零點。我嘗試了許多變體(oSearch(「64」),oSearch(「'64'」),oSearch(「\」64 \「」)),但似乎查詢解析器不適用於數字。 –