创建Solr扩展的dismax查询并将其与SolrIndexSearcher一起使用

时间:2014-03-12 15:32:31

标签: solr lucene

我正在尝试创建一个edismax查询并设置查询参数,如defType,df,q.op ...等。我能够创建一个布尔查询,但不能设置查询参数。任何想法如何?

private List<String> getBoostedElevationObj(ResponseBuilder rb) {
    SolrQueryRequest req = rb.req;

    Query query = rb.getQuery();

    List<String> docIds = null;

    try {
        BooleanQuery docIdsBq = new BooleanQuery();                     

        TermQuery tq2 = new TermQuery(new Term("subscription", "yes"));
        docIdsBq.add(tq2, BooleanClause.Occur.MUST);                                    

        SolrIndexSearcher solrIndexSearcher = req.getSearcher();

        DocList docList = solrIndexSearcher.getDocList(query, docIdsBq, null,
                0, 5);                      

        DocIterator docIterator = docList.iterator();
        docIds = new ArrayList<String>();
        int docId;
        Document doc = null;
        while (docIterator.hasNext()) {
            docId = docIterator.nextDoc();
            doc = solrIndexSearcher.doc(docId);             
            docIds.add(doc.get(idField));
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return docIds;
}

1 个答案:

答案 0 :(得分:1)

由于这些是查询解析器参数,并且您在这些手动构造的查询中消除了查询解析器,因此部分功能的责任落在您身上。

  • defType - 指定查询解析器的行为,由于此处未使用查询解析器,因此必须构造适合于类型的查询。如果您正在搜索int字段,NumericRangeQuery是合适的,等等。
  • df - 这也适用于已解析的查询。如果您手动构建查询,则需要指定字段。
  • q.op - 将条款添加到BooleanQuery时,您还必须指定BooleanClause.Occur设置,因此没有默认运算符。

其他一些常见的参数:

  • sort - 以Sort
  • 的形式传递到getDocList调用,第三个参数
  • 开始,行和过滤器 - 直接传递到getDocList
  • fl - 您可以将要返回的字段列表传递到IndexSearcher.doc来电。

此外,您应该记住,edismax通常会生成一个DisjunctionMaxQuery来连接子句,而不是一个BooleanQuery,并且它们的得分和构造方式存在显着差异。在你创建的BooleanQuery的情况下,这不是问题,因为:A - 它只有一个子句,而B - 它被用作过滤器。但是,如果您在此处考虑其他可能存在问题的案例,则可能值得记住。

相关问题