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」を検索すると、返された1つのヒットが返ってくれることを願っています。 –
残念ながら、それはゼロヒットを返します。私は多くのバリエーション(oSearch( "64")、oSearch( "'64'")、oSearch( "\" 64 \ ""))を試しましたが、クエリパーサーは数字では動作しないようです。 –