- Are the LinqToLucene and the Lucene.Net.Linq projects different?
- What are the pros and cons of each of them?
Since I found Lucene.Net.Linq to be updated more recently relative to LinqToLucene and it is available in nuget I want to use it in my simple project, but I came across lack of documentation and I can't find how can I use lucene advanced queries with this package like what are possible in LinqToLucene for example:
var query = from c in index.Customers where c.Like("amber") || c.CompanyName.Between("a", "d") where !c.CustomerId == "Jason"
If this extension functions aren't available then what is the point of this project?
- If it is not the point how can i use advance queries in LINQ to Lucene.Net?
2 回答
LINQ to Lucene 似乎处于非活动状态。撰写本文时的最后一次提交是在 2012 年 10 月,最后一次询问该项目是否处于活动状态的讨论帖自同一时间框架以来一直没有得到答复。
LINQ to Lucene 与实体框架有一些紧密耦合,因此在我看来,该项目旨在索引来自 EF 的数据以进行自由文本搜索。
Lucene.Net.Linq 是一个完全独立的项目,我从 2012 年开始并一直在积极维护。该项目与 EF 或其他库没有任何耦合。它只依赖于 Lucene.Net、Common.Logging 用于日志记录,以及 Remotion.Linq 用于帮助进行 LINQ 查询解析和翻译。我最初评估了为 LINQ to Lucene 做出贡献的可能性,但发现与 EF 的紧密耦合和其他一些假设使该库不适合我的需求。
LINQ to Lucene 缺点:
- 在 NuGet 上不可用
- 没有积极维护
- 可以放入条款的内容非常有限
where
- 无论您是否愿意,都与 EF 耦合
Lucene.Net.Linq 优点:
- 积极维护
- 发布到 NuGet 的包(和符号!)
- 更好地理解复杂的查询
- Fluent 和 Attribute API,用于将属性映射到字段并控制分析、存储和索引
Lucene.Net.Linq 缺点:
- 文档可能会更好
- 只有少数我自己以外的贡献
- 与 vanilla 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 > ()) {}
}
您可以使用文件系统而不是系统内存。