繁体   English   中英

Lucene.Net模糊搜索速度

[英]Lucene.Net fuzzy search speed

对此表示抱歉,但我希望得到经验丰富的Lucene的帮助。

现在,我们在应用程序Lucene.Net 3.0.3中使用〜2.500.000项进行索引和搜索。 每个实体包含27个可搜索字段,并以这种方式添加到索引中:new Field(key,value,Field.Store.YES,Field.Index.ANALYZED))

现在我们有两个搜索选项:

  1. 使用模糊搜索仅按4个字段进行搜索
  2. 使用精确搜索按4-27字段搜索

我们有一个搜索服务,每周可以自动搜索大约53000人,例如“鲍勃·休斯顿”,“萨拉·科纳尔”,“苏珊·洪·维恩霍”等。

因此,在选项1中 ,我们遇到缓慢的搜索速度,这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<string>())
                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) )或(PersonAliases:cong〜0.6)OR(PersonAlternativeSpellings:cong〜0.6)AND((PersonFirstName:hong〜0.6)OR(PersonLastName:hong〜0.6)OR(PersonAliases:hong〜0.6)OR(PersonAlternativeSpellings:hong〜0.6) )))

当前改进:

  1. 我们将这4个字段合并为1个搜索字段
  2. 我们决定在服务中使用单个IndexSearcher,而不是在每个搜索请求中都打开
  3. MergeFactor = 2

改进的总和使速度提高了30-40%

本文之后,我们进行了大多数可能的优化:

您还有其他建议在我们这种情况下如何提高搜索速度吗?

谢谢。

您可以通过将模糊查询的前缀长度设置为非零值来提高其速度。 这将使lucene有效地缩小可能结果的范围。 像这样:

queryParser.FuzzyPrefixLength = 2;

另外,它不会影响您作为示例提供的查询,但是如果您完全关心性能,则应删除queryParser.AllowLeadingWildcard = false;queryParser.AllowLeadingWildcard = false; 领先的通配符绝对会降低性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM