我目前已将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 以及每个单词的其他字段。因此,如果有人将 ' meat ' 拼写为 ' maet ',它会返回结果,因为 soundex 在 ' M300 ' 处是相同的。
我正在使用Luke查看数据集并看到正确的术语。当我使用 Luke 搜索 soundex(即。soundex:M300
)时,它不会返回任何结果,但是如果我搜索整个字段(即。soundex:"J500 M534 M300 B200"
),它会返回正确的文档。
阻止它在该领域内搜索出了什么问题?