具有多个条件的PHP Zend Lucene搜索查询失败

时间:2011-10-27 10:58:11

标签: php zend-lucene

Zend Lucene搜索文件

Lucene Document
    pk:Keyword
    category_id:Keyword
    title:UnStored
    description:UnStored

这是我的字符串查询“java lucene AND + category_id:7”。 结果在这里:

Array
(
    [0] => Array
        (
            [pk] => 209
            [category_id] => 7
            [id] => 0
            [score] => 0.40750848701418
        )
   [1] => Array
        (
            [pk] => 225
            [category_id] => 7
            [id] => 3
            [score] => 0.30750848701619
        )

    [2] => Array
        (
            [pk] => 211
            [category_id] => 8 ====>>> WRONG!!! 
            [id] => 2
            [score] => 0.37152213415004
        )

)

你能在category_id = 7上进行查询搜索吗? 提前谢谢。

2 个答案:

答案 0 :(得分:2)

我使用Zend Query Parsing解决了这个问题

$strQuery = Zend_Search_Lucene_Search_QueryParser::parse('java lucene');

$cateTerm  = new Zend_Search_Lucene_Index_Term(7 , 'category_id');
$cateQuery = new Zend_Search_Lucene_Search_Query_Term($cateTerm);

$query = new Zend_Search_Lucene_Search_Query_Boolean();
$query->addSubquery($strQuery, true /* required */);
$query->addSubquery($cateQuery, true /* required */);

结果仅在category_id = 7中:)

答案 1 :(得分:0)

您可以从查询中删除AND +category_id:7,您想要的是过滤器,因为不需要+category_id:7作为排名值。

我不知道如何使用Zend_Lucene实现它,但在solr中,我曾经传递过fq参数,这可能会给你一个提示:)

过滤是一个限制搜索空间的过程,只允许将一部分文档用于搜索命中。您可以使用此功能实现搜索范围内的搜索结果。 Lucene带有各种内置过滤器,如BooleanFilter,CachingWrapperFilter,ChainedFilter,DuplicateFilter,PrefixFilter,QueryWrapperFilter,RangeFilter,RemoteCachingWrapperFilter,SpanFilter等(本地JAVA VERSION )过滤器可以传递给IndexSearcher的搜索过滤符合过滤条件的文档的方法。