Lucene.Net模糊搜索速度
对不起,我希望得到Lucene经验丰富的人的帮助。
现在我们在我们的应用程序Lucene.Net 3.0.3中使用~2.500.000项目进行索引和搜索。 每个实体包含27个可搜索字段,以这种方式添加到索引:new Field(key,value,Field.Store.YES,Field.Index.ANALYZED))
现在我们有两个搜索选项:
- 使用模糊搜索仅搜索4个字段
- 使用精确搜索按4-27个字段搜索
我们有一个搜索服务,每周自动搜索约53000人,如“Bob Huston”,“Sara Conor”,“Sujan Hong Uin Ho”等。
因此,我们在选项1中遇到慢速搜索速度, s an average 4-8 sec in searcher.Search and it
搜索速度为s an average 4-8 sec in searcher.Search and it
是我们的主要问题。
搜索示例代码:
var index = FSDirectory.Open(indexPath); var searcher = new IndexSearcher(index, true); this.analyzer = new StandardAnalyzer(Version.LUCENE_30, new HashSet()) var queryParser = new MultiFieldQueryParser(Version.LUCENE_30, queryFields, this.analyzer); queryParser.AllowLeadingWildcard = false; Query query; query = queryParser.Parse(token); var results = searcher.Search(query, NumberOfResults);// NumberOfResults==500
我们的模糊搜索查询在4个字段中找到“bob cong hong”:
(((PersonFirstName:bob~0.6)OR(PersonLastName:bob~0.6)OR(PersonAliases:bob~0.6)OR(PersonAlternativeSpellings:bob~0.6))AND((PersonFirstName:cong~0.6)OR(PersonLastName:cong~0.6) )OR(PersonAliases:cong~0.6)或(PersonAlternativeSpellings:cong~0.6))AND((PersonFirstName:hong~0.6)OR(PersonLastName:hong~0.6)OR(PersonAliases:hong~0.6)OR(PersonAlternativeSpellings:hong~0.6) )))
目前的改进:
- 我们将这4个字段组合到1个搜索字段中
- 我们决定在服务中使用单个IndexSearcher而不是在每个搜索请求中打开
- 合并因子= 2
改进的总体组合产生约30-40%的速度增加 。
在本文之后,我们进行了大部分可能的优化:
- 索引放在SAS驱动器上非常快: http : //accessories.euro.dell.com/sna/productdetail.aspx?c = ie&l = en&s = dhs&cs = ahhs1&sku = 400-AHWT #Overview
- 我们有足够的RAM内存
- MergeFactor 2
- 试图将索引移动到RAMDirectory,但测试结果不稳定,有时速度是相同的
在我们的情况下,您有其他建议如何提高搜索速度吗?
谢谢。
您可以通过将模糊查询的前缀长度设置为非零值来提高模糊查询的速度。 这将允许lucene有效地缩小可能结果的集合。 像这样:
queryParser.FuzzyPrefixLength = 2;
此外,它不会影响您提供的查询作为示例,但如果您完全关心性能,则应删除行queryParser.AllowLeadingWildcard = false;
。 领先的通配符绝对会扼杀性能。