lucene 什么是最好的全文搜索开源项目(首选.NET)?

r7xajy2e  于 2022-11-07  发布在  Lucene
关注(0)|答案(2)|浏览(166)

我已经用Lucene库开发了一个索引和搜索应用程序。但是这个库在我上下文中自定义排名方面有一些限制,除了它的性能之外,我还需要可伸缩性和对各种词频的访问等等。有没有功能强大的开源全文库?

gg58donl

gg58donl1#

http://www.sphinxsearch.com
http://www.sphinxconnector.net/
Sphinx的主要功能包括:

  • 索引和检索性能高;
  • 先进的索引和查询工具(灵活且特征丰富的文本标记器、查询语言、几种不同的排序模式等);
  • 高级结果集后处理(带表达式的SELECT、WHERE、ORDER BY、GROUP BY等,针对文本搜索结果);
  • 经验证的可扩展性,每秒可处理数十亿个文档、数TB的数据和数千个查询;
  • 与SQL和XML数据源以及SphinxAPI、SphinxQL或SphinxSE搜索接口的轻松集成;
  • 易于扩展分布式搜索。

再展开一点,狮身人面像:

  • 具有较高的索引速度(在内部基准测试中,每个内核可达10-15 MB/秒);
  • 具有高搜索速度(在内部基准测试中,针对1,000,000个文档、1.2 GB数据,每个内核的查询数可达150-250次/秒);
  • 具有高可扩展性(已知最大的簇索引超过3,000,000,000个文档,最繁忙的簇索引峰值超过50,000,000个查询/天);
  • 通过短语接近度排序和统计(BM 25)排序的组合提供良好的相关性排序;
  • 提供分布式搜索能力;
  • 提供文档摘录(片段)生成;
  • 通过SphinxAPI或SphinxQL接口在应用程序中提供搜索,通过可插拔SphinxSE存储引擎在MySQL中提供搜索;
  • 支持布尔、短语、单词接近度和其他类型的查询;
  • 每个文档支持多个全文字段(默认情况下最多32个);
  • 支持每个文档的多个附加属性(即,组、时间戳等);
  • 支持停用字词;
  • 支持形态词词典;
  • 支持标记化异常;
  • 支持单字节编码和UTF-8;
  • 支持词干分析(英语、俄语和捷克语的词干分析器是内置的;以及用于法语、西班牙语、葡萄牙语、意大利语、罗马尼亚语、德语、荷兰语、瑞典语、挪威语、丹麦语、芬兰语、匈牙利语的词干分析器,可通过构建第三方libstemmer库来获得);
  • 原生支持MySQL(支持所有类型的表,包括MyISAM、InnoDB、NDB、Archive等);
  • 原生支持PostgreSQL;
  • 原生支持ODBC兼容数据库(MS SQL、Oracle等);
  • ...具有50多个此处未列出的其他功能,请参阅API和配置手册!
wz3gfoph

wz3gfoph2#

您可以使用库Bsa.Search.Core在.Net中进行搜索
该库包含4种索引类型:

  • 内存文档索引-快速内存索引
  • DiskDocumentIndex将索引存储在磁盘上
  • 文件文档索引-索引文件
  • ShardDocumentIndex -在磁盘上存储超过300万个文档的大型索引

使用内存索引的示例

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);

相关问题