我有一个带有搜索功能的spring MVC应用程序。
@GetMapping(params = "name")
public Page<User> findUserByName(@RequestParam("name") final String name) {
return userService.findUserByName(name);
}
@GetMapping(params = "department")
public Page<User> findUserByDepartment(@RequestParam final String department) {
return userService.findUserByFulltext(department);
}
虚拟查询生成器
public String searchByNameQuery(final String name) {
return "nm:" + name;
}
public String searchByDepartmentQuery(final String department) {
return "dpt:" + department;
}
现在,这个虚拟查询生成器不支持通配符或任何其他类型。我正在学习Apache Lucene Query API(还添加了Lucene Core-7.7.1来进行项目)和一大堆教授如何使用不同类型的查询实现(TermQuery、PhraseQuery、BooleanQuery等)的文章,但这根本没有意义。最后,我仍然手动构建查询。
有人能帮我演示一下如何才能有一个合适的Lucene查询生成器类吗?
我需要为这些类型的文本生成具有精确短语和通配符的查询
(exact)Search by name: Ohio State University
Search by name: *State
Search by name: Ohio*University
Search by name: Ohio State*
Search by Department:Computer Science Dept
Search by Department: *Science
组合查询:
nm:"Ohio State University" AND dpt:"Computer Science"
boolean查询生成器可以如下所示用于例如:
new BooleanQuery.Builder().add(query1, BooleanClause.OCCUR.MUST)
.add(query2, BooleanClause.OCCUR.MUST_NOT)
.build();
如果您希望有复杂的聚合,对于字段和搜索字符串-您可以编写类似的代码-
public class CustomBooleanQueryBuilder {
public Map<BooleanClause.Occur, List<Query>> getClauseQueryMap() {
return clauseQueryMap;
}
private final Map<BooleanClause.Occur, List<Query>> clauseQueryMap = new HashMap();
public static void main(String args[]) throws ParseException {
CustomBooleanQueryBuilder queryBuilder = new CustomBooleanQueryBuilder();
final Query regExpQuery = new RegexpQuery(new Term("nm", "Hello\\sWorld"));
queryBuilder.addUpdateQueryMap(regExpQuery, BooleanClause.Occur.MUST);
final Query wildcardQuery = new WildcardQuery(new Term("nm", "Hello?World"));
queryBuilder.addUpdateQueryMap(wildcardQuery, BooleanClause.Occur.MUST_NOT);
System.out.println(queryBuilder.aggregateQueryBoolean(queryBuilder.clauseQueryMap));
}
private String aggregateQueryBoolean(final Map<BooleanClause.Occur, List<Query>> clauseQueryMap) {
final BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder();
clauseQueryMap.forEach((booleanClause, queryList) -> queryList.forEach((query) -> booleanQueryBuilder.add(query, booleanClause)));
return booleanQueryBuilder.build().toString();
}
private void addUpdateQueryMap(final Query query, final BooleanClause.Occur booleanOccur) {
if (clauseQueryMap.containsKey(booleanOccur)) {
clauseQueryMap.get(booleanOccur).add(query);
} else {
final List<Query> queryList = new ArrayList();
queryList.add(query);
clauseQueryMap.put(booleanOccur, queryList);
}
}
}
问题: 我已经在lucene索引中索引了NGA Geonames地名录。我需要模糊查询一个字段(地名),但将查询限制为具有特定国家代码的记录。下面是我正在运行的一个示例查询 我没有使用SOLR,我已经做了大量的研究和尝试,但我没有明确的答案,可能是我的速度太慢了。 我想对印度进行模糊搜索,但我只想要与“in”(国家代码)完全匹配的记录
我在谷歌周围看了一段时间,但没有工作。有谁能帮我解决这个问题吗?
为什么buildspec文件支持多个构建阶段<代码>安装、预构建、构建、后构建?如果我将所有构建步骤都放在一个阶段中,我是否做错了什么?在这些阶段,除了保持某种结构之外,还有什么非常有用的东西吗?
假设我已将以下对象序列化为json字符串: 现在我想反序列化它,但是我想把名称分成两个字段,和。我该怎么做呢? 我希望最终的结果是类似于: 这对Gson有可能吗?
我必须将此添加到我执行的每个搜索查询中。我有一个大约20,000个文档的索引,我真的不想重建它,因为我在上一个版本中让我的用户重建了他们的索引。注意:这是在android设备上,所以需要很长的时间和大量的电池来重新索引他们的所有文档。 谢谢你的帮助。
我正在通过猫鼬使用MongoDB。 > MongoDB是执行集合扫描还是索引有助于提高查询效率?查询是否与仅使用id字段有任何不同? 如果MongoDB在您查询非索引字段时进行集合扫描。如果集合扫描完全相同,查询多个非索引字段是否会加快查询速度?假设我查询五个非索引字段而不是两个(都返回相同的文档)。两个查询是否都进行相同的集合扫描?