如何根据条件在多个字段中实现搜索

How to implement a search in multiple fields based on condition(s)

我正在尝试实现 Hibernate 全文搜索。用户可以选择哪些字段与搜索相关或不相关。这是由 JSF 中的六个(我的示例)布尔复选框完成的。

六个布尔值意味着 2^6 种可能的组合。我需要映射所有这些条件。

示例:

boolean a;
boolean b;
boolean c;
boolean d;
boolean e;
boolean f;

if(a){
// do a search with a 
}

..

if(a && b){
// do a search with a and b only
}

..

if(a && b && c){
// do a search with a and b and c only
}

在每个 IF 语句中,都应该调用一个方法。

特别是基于我的案例的示例:

用户想搜索姓氏 and/or 的用户。

org.apache.lucene.search.Query luceneQuery = qb.keyword()
                    .onFields("user.surname", "user.givenname")
                    .matching(searchstring).createQuery();

有条件地:

QueryBuilder qb = fullTextEntityManager.getSearchFactory()
            .buildQueryBuilder().forEntity(BeitragVO.class).get();

if(user){
org.apache.lucene.search.Query luceneQuery = qb.keyword()
                        .onFields("user.surname", "user.givenname")
                        .matching(searchstring).createQuery();
}

if(company){
org.apache.lucene.search.Query luceneQuery = qb.keyword()
                        .onField("company.name")
                        .matching(searchstring).createQuery();
}

   if(student && company){

    // How can I add all relevant fields(givenname, surname, and name of     
    company) to the query?
    }

有没有办法像 64 IF 那样做得更好?

您可以这样编写代码:

String search = "";

if(a){
    search += ...
}

..

if(b){
    search += ...
}

..

if(c){
    search += ...
}

只需通过每个复选框自行选择添加任何 SQL 查询(标准)代码,然后 运行 它

Hibernate 搜索最好使用条件查询来完成。 (查找它们。)在条件查询中,您可以逐个构建查询。所以,你最终会得到这样的结果:

create criteria query
add non-changing criteria query parts (like where to search, what to retrieve)
if( a ) add criteria query term for a
if( b ) add criteria query term for b
...
execute query

编辑:同样的原则适用于 Lucene 查询。

我真的很讨厌这个,我经常看到这个,但我想我的观点不够清楚,所以我会自己回答我的问题,抱歉!

我的一个朋友问我:“你不能使用字段列表,而不是按顺序传递它们吗?

好吧,我检查了一下,可以给 onFields() 一个字符串数组(多亏了 varargs (...))。

我将所有字段添加到列表中并将它们作为参数传递给我的方法。根据给定的条件,可以添加(或不添加)字段。

示例:

List<BeitragVO> results;

    List<String> fields= new ArrayList<String>();

    FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search
            .getFullTextEntityManager(em); // em = entitymanager



    QueryBuilder qb = fullTextEntityManager.getSearchFactory()
            .buildQueryBuilder().forEntity(BeitragVO.class).get();

    if (student) {
        fields.add("user.surname");
        fields.add("user.givenname");
    }
    if (company) {
        fields.add("company.name");
    }


    org.apache.lucene.search.Query luceneQuery = qb.keyword()
            .onFields(fields.toArray(new String[fields.size()]))
            .matching(searchterm).createQuery();

如果 company AND students 为真,则搜索将使用所有三个字段。