有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate搜索在布尔查询中处理null

是否有处理可选子查询的最佳实践?所以说我的搜索服务

query = builder.bool().must(createQuery(field1, term1)).must(createQuery(field2, term2)).createQuery();

createQuery(field, term) {
     if(term != null) {
          return builder.keyword().onField(field).matching(term).createQuery();
     }
     return null;
}

对于默认QueryBuilder,如果我使用这样的查询,并且术语为null,则生成的查询是“+term1+null”或类似的内容,这会在针对索引执行查询时导致null指针异常。是否有建议的方法来避免此问题?我正在考虑一个定制的QueryBuilder,但我不知道如何告诉全文会话使用我的实现,而不是默认的实现。我唯一能想到的另一种方式是

query;
query1 = createQuery(field1, term1);
query2 = createQuery(field2, term2);

if(query1 != null && query2 != null) {
    query = builder.bool().must(query1).must(query2).createQuery();
} else if(query1 != null && query2 == null) {
    query = query1;
} else if(query1 == null && query2 != null) {
    query = query2;
}

createQuery(field, term) {
     if(term != null) {
          return builder.keyword().onField(field).matching(term).createQuery();
     }
     return null;
}

但是,如果子查询的数量超过一小部分,就会很快变得非常混乱


共 (2) 个答案

  1. # 1 楼答案

    您可能要做的是引入一个方法,其唯一目的是以空安全的方式添加“必须”。也就是说,像这样做:

    BooleanJunction junction = builder.bool();
    must(junction, createQuery(field1, term1));
    must(junction, createQuery(field2, term2));
    query = junction.createQuery();
    
    void must(BooleanJunction junction, Query query) {
        if (query != null) {
            junction.must(query);
        }
    }
    
    Query createQuery(String field, Object term) {
         if(term != null) {
              return builder.keyword().onField(field).matching(term).createQuery();
         }
         return null;
    }
    

    这将消除BooleanJunction API的“流动性”,但由于它仅处于顶层,我想它还不错

  2. # 2 楼答案

    这个呢

        org.json.JSONObject json = new org.json.JSONObject();
        json.put(field1, term1);
        json.put(field2, term2);
        ...
    
    
        bool = builder.bool();
        for (Iterator keys = json.keys(); keys.hasNext();) {
            String field = (String) keys.next();
            String term = (String) json.get(field);
            q = createQuery(field, term);
            if (q != null) {
                bool.must(q);
            }
        }
        query = bool.createQuery();
    

    如果有不同术语的重复字段,则必须使用:

        org.json.JSONObject json = new org.json.JSONObject();
        json.append(field1, term1);
        json.append(field2, term2);
        ...
    
    
        bool = builder.bool();
        for (Iterator keys = json.keys(); keys.hasNext();) {
            String field = (String) keys.next();
            JSONArray terms = (JSONArray) json.get(field);
            for (int i = 0; i < terms.length(); i++) {
                String term = (String) terms.get(i);
                q = createQuery(field, term);
                if (q != null) {
                    bool.must(q);
                }
            }
        }
        query = bool.createQuery();