什么是最好的全文搜索开源项目(.NET优先)?

15

我使用Lucene库开发了一个索引和搜索应用。但是在我的场景中,该库在自定义排名方面存在一些限制。除了性能之外,我需要可扩展性和访问各种词频等所有数据。是否有其他强大的开源全文库可供使用?


2
我发现Lucene.net的性能非常出色,所以听到有人说他们在性能方面遇到了问题真是令人惊讶!(顺便说一句,Lucene还有一个相当不错的API,可以用于自定义评分等) - Adrian Conlon
我对Lucene的性能没有任何问题,但自定义排名非常困难。 - Ehsan
2个回答

6

http://www.sphinxsearch.com

http://www.sphinxconnector.net/

Sphinx的主要特点包括:

  • 高速的索引和搜索性能;
  • 先进的索引和查询工具(灵活且功能丰富的文本分词器、查询语言、几种不同的排名模式等);
  • 高级结果集后处理(对文本搜索结果进行选择、WHERE、ORDER BY、GROUP BY等操作);
  • 经过验证的可扩展性,可达到数十亿文档、千兆字节数据和每秒数千个查询的规模;
  • 可与SQL和XML数据源以及SphinxAPI、SphinxQL或SphinxSE搜索接口轻松集成;
  • 易于实现分布式搜索。

更详细地说,Sphinx:

  • 具有较高的索引速度(内部基准测试每个核心高达10-15 MB /秒);
  • 具有高速的搜索速度(内部基准测试每个核心针对1,000,000个文档、1.2 GB数据高达150-250次查询/秒);
  • 具有良好的可扩展性(已知最大集群索引超过30亿文档,最繁忙的一个达到每天超过5000万次查询);
  • 通过短语接近度排名和统计(BM25)排名的组合提供良好的相关性排名;
  • 提供分布式搜索能力;
  • 生成文档摘录(片段);
  • 使用SphinxAPI或SphinxQL接口从应用程序内部进行搜索,并使用可插拔的SphinxSE存储引擎在MySQL中进行搜索;
  • 支持布尔、短语、词接近度和其他类型的查询;
  • 支持每个文档多个全文字段(默认最多32个);
  • 支持每个文档多个附加属性(例如组、时间戳等);
  • 支持停用词;
  • 支持形态学单词形式字典;
  • 支持分词例外;
  • 支持单字节编码和UTF-8;
  • 支持词干处理(内置英语、俄语和捷克语的词干处理器,并通过构建第三方libstemmer库获得法语、西班牙语、葡萄牙语、意大利语、罗马尼亚语、德语、荷兰语、瑞典语、挪威语、丹麦语、芬兰语和匈牙利语的词干处理器);
  • 本地支持MySQL(支持所有类型的表,包括MyISAM、InnoDB、NDB、Archive等);
  • 本地支持PostgreSQL;
  • 本地支持符合ODBC标准的数据库(如MS SQL、Oracle等);
  • …还有50多个未在此处列出的其他功能,请参阅API和配置手册!

2
您可以使用库Bsa.Search.Core在.Net中进行搜索。
该库包含4种索引类型:
- MemoryDocumentIndex - 快速内存索引 - DiskDocumentIndex - 将索引存储在磁盘上 - FileDocumentIndex - 对文件进行索引 - ShardDocumentIndex - 在磁盘上存储超过3百万个文档的大型索引
以下是使用Memory索引的示例。
var field = "*";
var query = "one | two";

var documentIndex = new MemoryDocumentIndex();
var content = "one two one two second try to welcome";
var title = "one first second four";

while (!documentIndex.IsReady) 
{ 
    Thread.Sleep(500); 
}

var searchService = new SearchServiceEngine(documentIndex);

var doc = new IndexDocument("ExternalId");
doc.Add("content".GetField(content);
// filter
doc.Add("intValue".GetFilterField(10));
doc.Add("longValue".GetFilterField(20l));
doc.Add("dateValue".GetFilterField(DateTime.UtcNow));

searchService.Index(new IndexDocument[]
{
    doc
});

var query = "one | two";
var parsed = query.Parse("*");


var request = new SearchQueryRequest()
{
    Query = parsed,
    Field = field,
    ShowHighlight = true,
    OrderField = SortOrderFields.Relevance,
    Order = SortOrder.Desc,
    Size = 20,
    Fields = new List<string>()
    {
        "content","id"
    },
    Filter = new FilterClause()
    {
        Condition = FilterCondition.Equal,
        Value = "intValue".GetFilterField(10),
        Next = new FilterClause()
        {
            Condition = FilterCondition.Great,
            Value = "longValue".GetFilterField(21l)
        }
    }
};
var result = searchService.Search(request);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接