- LinqToLuceneとLucene.Net.Linqプロジェクトは異なりますか?
- それぞれの長所と短所は何ですか?
Lucene.Net.Linq が LinqToLucene に関連して最近更新され、nuget で利用できることがわかったので、単純なプロジェクトで使用したいのですが、ドキュメントが不足しており、lucene の使用方法が見つかりません。たとえば、LinqToLucene で可能なことのような、このパッケージを使用した高度なクエリ:
var query = from c in index.Customers where c.Like("amber") || c.CompanyName.Between("a", "d") where !c.CustomerId == "Jason"
この拡張機能が利用できない場合、このプロジェクトのポイントは何ですか?
- それが重要でない場合、LINQ to Lucene.Net で高度なクエリを使用するにはどうすればよいですか?
2 に答える
LINQ to Lucene は非アクティブのようです。執筆時点での最後のコミットは 2012 年 10 月であり、プロジェクトがアクティブかどうかを尋ねる最後のディスカッション投稿は、同じ時間枠以降未回答のままです。
LINQ to Lucene は Entity Framework と密結合しているため、このプロジェクトは EF からのデータにインデックスを付けてフリー テキスト検索を行うように設計されているように思えます。
Lucene.Net.Linq は、私が 2012 年に開始した完全に別のプロジェクトであり、積極的に維持しています。このプロジェクトには、EF や他のライブラリへの結合はありません。これは、ロギング用の Lucene.Net、Common.Logging、および LINQ クエリの解析と変換を支援するための Remotion.Linq にのみ依存します。私は当初、LINQ to Lucene に貢献する可能性を評価していましたが、EF との密結合やその他のいくつかの仮定により、ライブラリが私のニーズには不適切であることがわかりました。
LINQ to Lucene の短所:
- NuGet では利用できません
- 積極的に維持されていない
- 句に入れることができるものは非常に限られています
where
- 必要かどうかに関係なく EF に結合
Lucene.Net.Linq の長所:
- 積極的に維持
- NuGet に公開されたパッケージ (およびシンボル)
- 複雑なクエリの理解が深まる
- プロパティをフィールドにマップし、分析、ストレージ、およびインデックス作成を制御する Fluent および Attribute API
Lucene.Net.Linq 短所:
- ドキュメンテーションはもっと良いかもしれません
- 自分以外の貢献はほんの一握り
- 通常の Lucene.Net と比較した場合のパフォーマンスが不明確 (パフォーマンス テストはあまり行われていません)
このようなドキュメントは、プロジェクトの README と単体テスト プロジェクトのサンプルコードで構成されています。
Lucene.Net.Linq には、Lucene.Net がネイティブにサポートするすべてのクエリの拡張メソッドがあるわけではありません。ただし、独自の を渡すことができるエスケープ ハッチを提供しますQuery
。
var result = customers
.Where(new TermRangeQuery("CompanyName", "A", "C", includeLower: true, includeUpper: true))
.ToList();
また、あいまい一致を使用したインデックス付きフィールドの検索もサポートしています。
var result = customers
.Where(c => (c.AnyField() == "amber").Fuzzy(1.0f))
.ToList();
==
そして、 and との単純なマッチングをサポートしています!=
:
var result = customers
.Where(c => c.CustomerId != "Jason")
.ToList();
の意味は==
、特定のフィールドのインデックス方法によって制御されることに注意してください。フィールドがキーワードとして索引付けされている場合、完全一致が有効になります。フィールドがトークン化、語幹化、小文字への変換などされている場合、フィールド==
内の任意の用語と一致します。
このコードで:
var directory = FSDirectory.Open(AppDomain.CurrentDomain.BaseDirectory + "/index/recipes");
using(var provider = new LuceneDataProvider(directory, Lucene.Net.Util.Version.LUCENE_30)) {
using(var session = provider.OpenSession < CatalogItemDocument > ()) {}
}
システムメモリではなく、ファイルシステムで作業できます。