Hus*_*man 3 database sql-server lucene indexing search-engine
我正在使用.Net开发一个高级搜索引擎,用户可以根据以下几个字段构建查询:
我正在使用lucene来索引文档内容及其相应的ID.但是,其他元数据驻留在MS SQL DB中(以避免扩大索引,并在对元数据的任何修改时不断更新索引).
我如何进行搜索?
当任何用户搜索一个术语时:
正如您在此处注意到的,在DB中有一个查找,然后是Lucene和Finally DB,以获取要在Grid中显示的值.
问题:
怎么能克服这种情况?我想开始搜索lucene,但如果索引的文件达到200万,这就有一个缺点.(我认为首先使用数据库缩小结果会对性能产生很大影响).
另一个问题是将ID传递给lucene Search Service,传递数十万个ID的效果如何?什么是替代解决方案?
我欢迎任何想法,所以请分享您的想法.
您当前的解决方案在查询时产生以下开销:
1)通过MS-SQL缩小搜索空间
2)通过Lucene.NET执行有界全文搜索
3)通过MS-SQL实现结果细节
您可能会做出两个假设,值得重新考虑
A)索引所有元数据(日期,作者,位置等)将无法接受地增加索引的大小.
首先尝试一下:这是最佳实践,除了文本搜索之外,让Lucene为您完成所有过滤,您将大大减少查询执行开销.
此外,索引的大小主要与每个字段的基数有关.例如,如果您只有500个唯一所有者名称,那么将只存储那500个字符串,并且每个lucene文档将通过符号表查找在内部引用其所有者(4字节整数*2MM docs + 500 strings = <8MB另外).
B)MS-SQL查询将是过滤非文本元数据的最快方式.
总结一下最佳实践:
索引要查询或筛选的所有数据.(无需存储源数据,因为MS-SQL是您的记录系统).
针对Lucene运行筛选查询(例如文本和日期范围,所有者,位置等...)
返回ID
使用返回的ID从MS-SQL实现文档.
我还建议探索迁移到独立搜索服务器(Solr或Elasticsearch)的原因有很多: