Lucene.Net模糊搜索速度

时间:2015-09-19 12:09:29

标签: c# performance search lucene lucene.net

对不起担心,但我希望得到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个字段搜索
  3. 我们有一个搜索服务,每周自动搜索约53000人,如“Bob Huston”,“Sara Conor”,“Sujan Hong Uin Ho”等。

    因此,我们在选项 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)OR(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:红〜0.6)))

    目前的改进:

    1. 我们将这4个字段合并为1个搜索字段
    2. 我们决定在服务中使用单个IndexSearcher而不是在每个搜索请求中打开
    3. MergeFactor = 2
    4. 改进的总体组合产生 30-40%的速度增加

      article之后,我们进行了大部分可能的优化:

      在我们的情况下,您是否有其他建议如何提高搜索速度?

      谢谢。

1 个答案:

答案 0 :(得分:1)

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

/**
 * Definition for an interval.
 */
struct Interval {
    int start;
    int end;
    Interval() : start(0), end(0) {}
    Interval(int s, int e) : start(s), end(e) {}
};

此外,它不会影响您提供的查询作为示例,但如果您完全关心性能,则应删除行queryParser.FuzzyPrefixLength = 2; 。领先的通配符绝对会扼杀性能。