首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个BooleanQuery的Lucene FuzzyQuery太慢了

具有多个BooleanQuery的Lucene FuzzyQuery太慢了
EN

Stack Overflow用户
提问于 2017-10-11 10:51:40
回答 1查看 448关注 0票数 1

文档是具有多个字段名(如:empName, empId, departmentId etc )的公司的员工数据。

使用自定义分析器已经索引了大约400万个数据。

搜索查询有一个list of employees' name,并且知道列表中的所有员工都属于同一个部门。公司有多个部门。

所以我想为所有员工的名字做fuzzy search,因为我的名字是给定的department id

为此,我使用布尔查询,如下所示:

代码语言:javascript
复制
Query termQuery = new TermQuery(new Term("departmentId","1234"));
BooleanQuery.Builder bld = new BooleanQuery.Builder();
for(String str:employeeNameList) {
    bld.add(new FuzzyQuery(new Term("name",str)), BooleanClause.Occur.SHOULD);
 }       
BooleanQuery bq = bld.build();
BooleanQuery finalBooleanQuery = new BooleanQuery.Builder()
                .add(termQuery, BooleanClause.Occur.MUST)
                .add(bq, BooleanClause.Occur.MUST).build();

现在,在finalBooleanQuerysearch方法中传递IndexSearcher并得到结果。

问题在于它花费了太多的时间,当employeeNameList more than 50的大小需要500 ms来搜索时。

如何减少从500 ms50 ms的时间?

这个问题还有别的解决办法吗?

EN

回答 1

Stack Overflow用户

发布于 2017-10-11 15:40:58

如果您查看FuzzyQuery的其他构造函数,您将看到一些改进性能的简单方法。每增加一个参数,您就可以减少FuzzyQuery将要做的工作量,从而提高性能。

首先,也是最重要的:

  • 前缀长度:我强烈建议将其设置为非零值。这是多少字符在词的开头将不会受到模糊匹配。因此,如果搜索前缀为1的"abc“,则"abb”和"acc“将匹配,而不是"bbc”。这允许lucene在尝试查找匹配项时使用索引,而不必扫描整个术语字典。您可能会看到这里最大的性能改进。许多人似乎认为2是性能和满足搜索需求之间的一个很好的平衡点。

其他可用的参数也可以帮助:

  • maxEdits -2是缺省值,也是最大值。将此设置为1将匹配较少,因此,工作速度更快。
  • maxExpansions -在遮罩下,该查询查找与模糊参数匹配的术语,然后执行对这些术语的搜索。如果您正在搜索短期项,特别是,此匹配项列表可能会非常长。设置maxExpansions将防止出现这些非常长的匹配列表。缺省值是50。
  • 转换-是否交换两个字符是允许的编辑。默认值是真的。基本上,Levenshtein和Damerau-Levenshtein的区别。假是更少的工作量和更少的匹配,所以会表现得更好。不过,我不知道差别会不会有那么大。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46686374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档