私はLucene.netの書籍の索引を作成しました。すべてうまくいっていますが、インデックスを照会する別の方法を追加する必要があり、それを実行する方法がわかりません。Lucene.NetはTermRangeQueryより大きい/小さいですか?
基本的に各書籍の年齢は適切です。これは、 - minAgeとmaxAgeの2つの列で表されます。どちらの列も整数です。
あなたは、私はそれはそれに対してTermRangeQueryを実行するのが最も簡単だろうと思って、私はMINAGEとMAXAGEフィールドを水増ししています見ることができるように私は、次のループ
foreach (var catalogueBook in books)
{
var book = new Book(catalogueBook.CatalogueBookNo,catalogueBook.IssueId);
var strTitle = book.FullTitle ?? "";
var strAuthor = book.Author ?? "";
// create a Lucene document for this book
var doc = new Document();
// add the ID as stored but not indexed field, not used to query on
doc.Add(
new Field(
"BookId",
book.CatalogueBookNo.ToString(System.Globalization.CultureInfo.InvariantCulture),
Field.Store.YES,
Field.Index.NOT_ANALYZED_NO_NORMS,
Field.TermVector.NO));
// add the title and author as stored and tokenized fields, the analyzer processes the content
doc.Add(
new Field("FullTitle",
strTitle.Trim().ToLower(),
Field.Store.YES,
Field.Index.ANALYZED,
Field.TermVector.NO));
doc.Add(
new Field("Author",
strAuthor.Trim().ToLower(),
Field.Store.YES,
Field.Index.ANALYZED,
Field.TermVector.NO));
doc.Add(
new Field("IssueId",
book.IssueId,
Field.Store.YES,
Field.Index.NOT_ANALYZED_NO_NORMS,
Field.TermVector.NO));
doc.Add(
new Field(
"PublicationId",
book.PublicationId.Trim().ToLower(),
Field.Store.YES,
Field.Index.NOT_ANALYZED_NO_NORMS,
Field.TermVector.NO));
doc.Add(
new Field(
"MinAge",
book.MinAge.ToString("0000"),
Field.Store.YES,
Field.Index.NOT_ANALYZED_NO_NORMS,
Field.TermVector.NO));
doc.Add(
new Field(
"MaxAge",
book.MaxAge.ToString("0000"),
Field.Store.YES,
Field.Index.NOT_ANALYZED_NO_NORMS,
Field.TermVector.NO));
doc.Add(new NumericField("Price",Field.Store.YES,true).SetDoubleValue(Convert.ToDouble(book.Price)));
//Now we can loop through categories
foreach(var bc in book.GetBookCategories())
{
doc.Add(
new Field("CategoryId",
bc.CategoryId.Trim().ToLower(),
Field.Store.YES,
Field.Index.NOT_ANALYZED_NO_NORMS,
Field.TermVector.NO));
}
// add the document to the index
indexWriter.AddDocument(doc);
}
// make lucene fast
indexWriter.Optimize();
}
でこれらのフィールドをインデックス化して保存しています。
しかし、minAgeとmaxAgeで定義されたAgeの範囲にAgeが含まれるかどうかを調べるには、AgeでminAge列とmaxAge列の両方を照会する必要があります。
SQLは、残念ながら、私はこれを行う方法を参照することはできません
Select *
From books
where @age >= minAge and @age <= maxAge
だろう。これはLucene.Netでも可能ですか?
はあなたのアドバイスを使用し、それが御馳走を働きました。検索のためのソリューションで終わったので、私は以下で概要を説明します。 – wingyip