是否可以配置Solr,以便queryResponse.getFacetFields()中的基数以连接的正常形式反映查询?

时间:2014-06-16 15:57:54

标签: solr faceted-search facet conjunctive-normal-form

用于分面搜索的Apache Solr API非常直观。使用SolrQuery类,可以轻松构建AND连接查询,针对存储库执行主题并处理结果。作为非常好的功能,Solr发回一个带有FacetField列表的queryResponse对象,该列表提供了适用于剩余方面的基数。

for ( FacetField facetField : queryResponse.getFacetFields() )
{
    logger.debug( facetField.getName() );
    for ( Count count : facetField.getValues() )
    {
        logger.debug( " " + count.getName() + "(" + count.getCount() + ")" );
    }
}

我的问题是:是否可以以这些返回的基数反映联合正态形式(CNF)中的查询的方式配置Solr,换句话说,查询不同构面字段的AND连接和相同构面字段的OR连接?

至少在默认配置中,queryResponse.getFacetFields()中似乎只有AND连接的查询。我想在没有解决方法的情况下使用queryResponse.getFacetFields(),并希望问题是配置问题。

为了更好地理解这里具有Solr API的实际和预期返回值的具体用例:假设一组1000个项目。每个项目可能有几个概念和集合模式的分配。因此,项目文档的solr模式具有两个字段c用于概念,moc用于收集模式。为这些字段启用了分面搜索。

希望很容易理解,这里是伪代码中的相关查询和结果集的基数。 F(c:position)表示已分配概念位置的项目集,F(moc:postal)表示具有邮政分配收集模式的项目集。 Qi显示查询和结果集,|Qi|是其基数。

Q1: F(c:position) 
    -> |Q1| = 252
Q2: F(moc:telefonic) 
    -> |Q2| = 393
Q3: F(moc:postal) 
    -> |Q3| = 464
Q4: F(c:position) AND F(moc:telefonic) 
    -> |Q4| = 14 + 10 = 24
Q5: F(c:position) AND F(moc:postal) 
    -> |Q5| = 33 + 10 = 43
Q6: F(c:position) AND F(moc:telefonic) AND F(moc:postal) 
    -> |Q6| = 10
Q7: F(c:position) AND F(moc:telefonic) AND NOT F(moc:postal) 
    -> |Q7| = 14
Q8: F(c:position) AND F(moc:postal) AND NOT F(moc:telefonic) 
    -> |Q8| = 33
Q9: F(c:position) AND (F(moc:telefonic) OR F(moc:postal)) 
    -> |Q9| = 14 + 10 + 33 = 57

下图显示了集合和子集的基数:

Venn diagram for faceted search

现在我们开始一个特定的搜索:Q9是感兴趣的查询。选择任何方面。方面显示预期值:Q1为252,Q2为393,Q3为464。用户选择构面c:position并将结果集的基数从1000减少到252.基础查询是Q1。返回的构面显示moc:telefonic的24个项目和moc:postal的43个项目。这些值表示选择其中一个方面会将结果集限制为24(= 14 + 10)或43(= 33 + 10)项。在第二步中,用户另外选择方面moc:postal。基础查询是Q5。结果集的实际和预期基数相互对应,它是43.到目前为止一直很好!

如果使用前一个选择进行CNF查询,您现在希望返回哪个方面moc:telefonic的基数?我期待14项。如果我选择方面moc:telefonic,我的结果集将从43到57增加这些额外项目。不幸的是,Solr显示了10个项目。如果所有方面都是AND连接,这将是正确的。作为用户,我感到困惑,因为我的结果集有57个而不是53个项目。

// Q5: F(c:position) AND F(moc:postal) 
solrDocumentList = queryResponse.getResults();
assertEquals( 43, solrDocumentList.getNumFound() );
facetField = queryResponse.getFacetField( "moc" );
assertEquals( "telefonic", facetField.getValues().get( 0 ).getName() );

// test fails: returned value is 10
assertEquals( 14, facetField.getValues().get( 0 ).getCount() );

0 个答案:

没有答案