用户可以搜索多个条件,每个条件都是关系AND。
我希望'买家'并且'评论'搜索结果可以满足搜索条件,转换sql语句如下:WHERE买家LIKE'%xxxx%'并且评论喜欢'%xxxx%'
如果我设置了BooleanClause.Occur.MUST两个字段,则永远不会找到结果。但是如果我将一个字段设置为BooleanClause.Occur.SHOULD,则可以找到,但不符合搜索条件。
如何让我的Lucene(5.0)可以像买家一样喜欢'%xxxx%'和评论喜欢'%xxxx%'相同的查询?
我的代码:
public List<T> query(int page, int size, String description, Date startDate, Date endDate, String buyers) {
IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get(indexPath)));
IndexSearcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();
BooleanQuery query = buildQuery(description, buyers, analyzer);
Query arrivalDateQuery = NumericRangeQuery.newLongRange("arrivalDate", startDate.getTime(), endDate.getTime(), true, true);
query.add(arrivalDateQuery, BooleanClause.Occur.MUST);
// outout:+remark:tape +buyers:company +arrivalDate:[1356969600000 TO 1425916800000]
logger.debug("queryString: " + query.toString());
}
private BooleanQuery buildQuery(String description, String buyers, Analyzer analyzer) {
BooleanQuery query = new BooleanQuery();
QueryBuilder builder = new QueryBuilder(analyzer);
if (description.length() > 0) {
Query descriptionQuery = builder.createBooleanQuery("remark", description);
query.add(descriptionQuery, BooleanClause.Occur.MUST); // error, not found
}
if (buyers.length() > 0) {
Query buyersQuery = builder.createBooleanQuery("buyers", buyers);
query.add(buyersQuery, BooleanClause.Occur.MUST); // error, not found
}
return query;
}
答案 0 :(得分:0)
对我来说它应该有用......
您的字段有哪些类型?如果它们不是TextField,它们将不会被标记化,这可能是问题所在。
如果你把Occur.SHULD,结果是什么样的?理解问题会更容易。如果您要显示数据的样子