Lucene,如何进行多场搜索?

时间:2015-03-10 07:36:07

标签: lucene

用户可以搜索多个条件,每个条件都是关系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;
}

1 个答案:

答案 0 :(得分:0)

对我来说它应该有用......

  1. 您的字段有哪些类型?如果它们不是TextField,它们将不会被标记化,这可能是问题所在。

  2. 如果你把Occur.SHULD,结果是什么样的?理解问题会更容易。如果您要显示数据的样子