gpt4 book ai didi

java - Lucene BooleanQuery 与多个 FuzzyQuery 太慢

转载 作者:行者123 更新时间:2023-11-30 02:21:32 25 4
gpt4 key购买 nike

一个Document是一家公司的员工数据,具有多个字段名称,例如:empName、empId、departmentId 等

使用自定义分析器已对大约 400 万条数据建立了索引。

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

所以我想对给定部门 ID 下的所有员工姓名进行模糊搜索

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

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();

现在在 IndexSearchersearch 方法中传递 finalBooleanQuery 并获取结果。

问题是它花费了太多时间,当employeeNameList的大小超过50时,搜索需要大约500毫秒

如何将时间从 500 毫秒 减少到 50 毫秒

这个问题还有其他解决办法吗?

最佳答案

如果您查看 FuzzyQuery 的其他构造函数,您会发现一些提高性能的简单方法。每个附加参数都可以帮助您减少 FuzzyQuery 要做的工作量,从而提高性能。

首先,也是最重要的:

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

其余可用参数也可以提供帮助:

  • maxEdits - 2 是默认值,也是最大值。将其设置为 1 将减少匹配次数,因此工作速度更快。

  • maxExpansions - 在底层,此查询查找与模糊参数匹配的术语,然后执行对这些术语的搜索。特别是如果您正在搜索短期术语,则此匹配术语列表可能会很长。设置 maxExpansions 将防止出现这些极长的匹配列表。默认值为 50。

  • 换位 - 交换两个字符是否是允许的编辑。默认为 true。基本上,Levenshtein 和 Damerau-Levenshtein 之间的区别。 false 表示更少的工作和更少的匹配,因此会表现得更好。不知道差别会不会那么大。

关于java - Lucene BooleanQuery 与多个 FuzzyQuery 太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46686374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com