检查两个查询是否相同

时间:2014-02-09 17:26:13

标签: solr lucene

我有很大的索引和很高的查询频率。 为了减少对Solr的请求数量,我想看看两个查询是否相同,或者一个是另一个查询的子查询没有运行它们

例如: 有趣和星期五==星期五和乐趣!=有趣或星期五

有趣的是Fun *

的子查询

等等任何想法? mb与分析仪或smth?

干杯

2 个答案:

答案 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内部有任何工具可以帮助解决这个问题。