如何根据条件在多个字段中实现搜索
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 为真,则搜索将使用所有三个字段。
我正在尝试实现 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 为真,则搜索将使用所有三个字段。