我有很大的索引和很高的查询频率。 为了减少对Solr的请求数量,我想看看两个查询是否相同,或者一个是另一个查询的子查询没有运行它们
例如: 有趣和星期五==星期五和乐趣!=有趣或星期五
有趣的是Fun *
的子查询等等任何想法? mb与分析仪或smth?
干杯
答案 0 :(得分:0)
您可以比较已解析的查询对象是否相等。要忽略布尔子句的顺序,您需要为此指定自己的比较器。以同样的方式,您应该能够检查查询是否是另一个查询的子查询。我刚才这样做的原因与你的原因完全相同,而且效果很好。
以下是一个小示例代码,用于在子句的顺序不重要时比较查询:
public boolean areEqualsOrderNotImportant(Query q1, Query q2) {
if((q1 instanceof BooleanQuery) && (q2 instanceof BooleanQuery)) {
BooleanQuery bq1 = (BooleanQuery)q1;
BooleanQuery bq2 = (BooleanQuery)q2;
if(bq1.getClauses().length!=bq2.getClauses().length) {
return false;
}
for(BooleanClause clause: bq1.getClauses()) { //multiple occurence of same clause not handled
if(!contains(bq2.getClauses(), clause)){
return false;
}
}
return true;
}else {
return q1.equals(q2);
}
}
答案 1 :(得分:0)
处理此问题的常用方法是规范化两个项目(将它们置于标准顺序中),然后执行比较(如排序2个文件,然后比较已排序的文件以查找差异)。
在您的情况下,您必须解析查询,将它们按标准顺序排列,然后执行比较。不过,我不知道Lucene内部有任何工具可以帮助解决这个问题。