我有2个索引,一个用于元数据,一个用于文本,我希望能够删除查询中的所有字段搜索,并且只使用用户搜索的默认字段,即“help AND title:carpool”i只想要帮助部分,想法?
答案 0 :(得分:1)
遍历BooleanQuery树并删除与Term(“help”)相关的条目
答案 1 :(得分:1)
这是您的代码应该是什么样子的大概:
public static void removeNonDefault(BooleanQuery query, String defaultField) {
List<BooleanClause> clauses = (List<BooleanClause>)query.clauses();
Iterator<BooleanClause> iter = clauses.iterator();
while(iter.hasNext()) {
BooleanClause clause = iter.next();
Query subQuery = clause.getQuery();
if(subQuery instanceof BooleanQuery) {
removeNonDefault((BooleanQuery)subQuery, defaultField);
} else if(subQuery instanceof TermQuery) {
if (!((TermQuery) subQuery).getTerm().field().equals(defaultField)) {
iter.remove();
}
}
}
}
这样做是使用TermQuery
中的非默认字段删除BooleanQuery
,然后递归到子布尔查询。
请注意,此代码不完整。根据您的具体情况,您可能需要担心更多类型的查询,例如词组查询和常量得分范围查询。
确保在调用此函数之前执行query.rewrite()
,将任何通配符查询转换为布尔查询。