Zend Search Lucene - 搜索特定字段

时间:2012-05-03 12:52:43

标签: php zend-framework zend-search-lucene

我目前已将 Zend_Search_Lucene 设置为我正在处理的项目的搜索引擎。

它在默认级别上工作得很好(即搜索所有字段),但我现在需要搜索特定字段。

原因是因为我试图编写处理拼写错误的能力。因此,我在文档标题中添加了每个单词的soundex。

例如:

$productArray['title'] = 'June Monthly Meat Box';  
$doc = new Zend_Search_Lucene_Document();  
$doc->addField(Zend_Search_Lucene_Field::text('product_title', $productArray['title']));  
$soundex = implode(' ',  array_map('soundex', array_map('trim', preg_split('/ /', $productArray['title'], NULL, PREG_SPLIT_NO_EMPTY))));  
$doc->addField(Zend_Search_Lucene_Field::keyword('soundex', $soundex));  
$index->addDocument($doc);

这增加了'J500 M534 M300 B200'作为soundex领域。

以下是搜索的执行方式:

$queryString = trim(urldecode($this->_request->getParam('q')));  
$words = array_map('trim', preg_split('/ /', $queryString, NULL, PREG_SPLIT_NO_EMPTY));    

$query = new Zend_Search_Lucene_Search_Query_Boolean();  
$subquery1 = new Zend_Search_Lucene_Search_Query_MultiTerm();  
foreach($words as $word) 
{  
    $subquery1->addTerm(new Zend_Search_Lucene_Index_Term($word));  
}  

$subquery2 = new Zend_Search_Lucene_Search_Query_MultiTerm();  
foreach($words as $word)
{  
        $subquery2->addTerm(new Zend_Search_Lucene_Index_Term(strtolower(soundex($word)), 'soundex'));  
}  
$query->addSubquery($subquery1);  
$query->addSubquery($subquery2);  

变量$subquery1存储原始查询的每个单词(这可以单独使用)
变量$subquery2存储每个单词的soundex。计划是在字段中搜索soundex以及每个单词的其他字段。因此,如果某人使用“ maet ”拼错“”,则会返回结果,因为soundex在“ M300 ”处会相同。

我正在使用Luke查看数据集并看到正确的字词。当我使用Luke搜索soundex(即soundex:M300)时,它不返回任何结果,但是如果我搜索整个字段(即。soundex:"J500 M534 M300 B200"),它将返回正确的文档。

阻止它在野外搜索会出现什么问题?

1 个答案:

答案 0 :(得分:0)

如果我正确理解Zend_Search_Lucene_Field :: keyword(您在上面用于“soundex”),它被设计为一次存储一个值(如单个日期或单个URL)。

我认为对于“soundex”字段,您希望使用像Zend_Search_Lucene_Field :: text这样的标记化存储方法,因为它听起来像是要在“soundex”字段中搜索单个标记,而不仅仅是整个字段值