对不起担心,但我希望得到Lucene经验丰富的人的帮助。
现在我们在我们的应用程序Lucene.Net 3.0.3中使用~2.500.000项目进行索引和搜索。 每个实体包含27个可搜索字段,以这种方式添加到索引:new Field(key,value,Field.Store.YES,Field.Index.ANALYZED))
现在我们有两个搜索选项:
我们有一个搜索服务,每周自动搜索约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)))目前的改进:
改进的总体组合产生 30-40%的速度增加。
在article之后,我们进行了大部分可能的优化:
在我们的情况下,您是否有其他建议如何提高搜索速度?
谢谢。
答案 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;
。领先的通配符绝对会扼杀性能。