代码之家  ›  专栏  ›  技术社区  ›  NeatNerd

检查两个查询是否相同

  •  0
  • NeatNerd  · 技术社区  · 12 年前

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

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

    Funny是Fun的子查询*

    有什么想法吗?mb与分析仪或smth?

    干杯

    2 回复  |  直到 12 年前
        1
  •  0
  •   fatih    12 年前

    您可以比较分析的查询对象是否相等。要忽略布尔子句的顺序,需要为此指定自己的比较器。同样,您应该能够检查一个查询是否是另一个查询的子查询。我不久前就这么做了,原因和你完全一样,而且效果很好。

    下面是一个小示例代码,用于在子句的顺序不重要时比较查询:

    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);
        }
    }
    
        2
  •  0
  •   Mark Leighton Fisher    12 年前

    处理这一问题的一种常见方法是将两个项目标准化(按标准顺序排列),然后执行比较(如对2个文件进行排序,然后比较排序后的文件以查找差异)。

    在您的情况下,您必须解析查询,按标准顺序排列,然后执行比较。不过,我不知道Lucene中有什么现成的工具可以帮助实现这一点。