2016-08-24 63 views
1

在ZF2我使用下面的代码来生成一个Lucene查询:ZF2 Lucene的查询返回任何内容 - 卢克同一查询返回预期的结果

$query = new Lucene\Search\Query\Boolean(); 

    $term = new Lucene\Index\Term($search->type, 'type'); 
    $subqueryTerm = new Lucene\Search\Query\Term($term); 
    $query->addSubquery($subqueryTerm, true); 

    $term = new Lucene\Index\Term('[+<= ' . $search->purchase_value . ']', 'min_price'); 
    $subqueryTerm = new Lucene\Search\Query\Term($term); 
    $query->addSubquery($subqueryTerm, true); // required 

    $term = new Lucene\Index\Term('[' . $search->purchase_value . ' >=]', 'max_price'); 
    $subqueryTerm = new Lucene\Search\Query\Term($term); 
    $query->addSubquery($subqueryTerm, true); // required 

产生以下查询:

+(type:Buying) +(min_price:[+<= 160.00]) +(max_price:[160.00 >=]) 

当我在ZF2中运行这个查询时($hits = $index->find($query);),我得到一个返回的空数组,但是当我使用Luke手动对索引运行查询时,它返回我期待的结果。

我需要在我的代码中进行更改以使其返回与Luke相同的结果?

我使用的是默认的分析这两个系统:

  • 卢克:org.apache.lucene.analysis.KeywordAnalyzer
  • ZF2:(我认为是)\ZendSearch\Lucene\Analysis\Analyzer\Common\Text

我需要使用不同的QueryParser?

+0

认为它可能与我使用'str_pad($ input,10,0,STR_PAD_LEFT)'的数量的长度有关,所以存储的值与'0000432.10'类似。我也以相同的方式格式化查询。同样,它适用于Luke,但不适用于ZF2。 –

回答

1

您在领域min_price中搜索条件“[+ < = 160.00]”。你是而不是创建一个范围查询。我不太明白你使用不同的QueryParser的意思,你根本没有使用QueryParser,你使用API​​来构建你的查询。你需要使用一个range search

$term = new Lucene\Index\Term($search->purchase_value, 'min_price'); 
$subqueryRange = new Lucene\Search\Query\Range(null, $term, true); 
$query->addSubquery($subqueryRange, true); 

$term = new Lucene\Index\Term($search->purchase_value, 'max_price'); 
$subqueryRange = new Lucene\Search\Query\Range($term, null, true); 
$query->addSubquery($subqueryRange, true); 

我假设在这里,顺便说一下,那个“+ < =”,就是要查询语法为小于或等于。我对lucene中支持这种语法的任何东西都不熟悉。如图所示,开放式范围将是正确的使用方式。