使用Zend_Search_Lucene搜索数字

时间:2009-02-13 18:46:12

标签: php zend-framework full-text-search

那么为什么下面的第一个搜索示例没有返回结果呢?关于如何修改以下代码以进行数字搜索的任何想法都将非常受欢迎。

创建索引

$index = new Zend_Search_Lucene('/myindex', true);
$doc->addField(Zend_Search_Lucene_Field::Text('ssn', '123-12-1234'));
$doc->addField(Zend_Search_Lucene_Field::Text('cats', 'Fluffy'));
$index->addDocument($doc);
$index->commit();

搜索 - 无结果

$index = new Zend_Search_Lucene('/myindex', true);
$results = $index->find('123-12-1234');

搜索 - 结果

$index = new Zend_Search_Lucene('/myindex', true);
$results = $index->find('Fluffy');

2 个答案:

答案 0 :(得分:3)

首先,您需要更改文本分析器以包含数字

Zend_Search_Lucene_Analysis_Analyzer :: setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum());

然后,对于包含数字的字段,您要使用 Zend_Search_Lucene_Field :: Keyword 而不是 Zend_Search_Lucene_Field :: Text 这将跳过令牌的创建并将值“原样”保存到索引中。然后你可以搜索它。我不知道浮点数的行为(可能不适用于浮点数3.0不会匹配3)但是对于自然数字(如ids)来说就像一个魅力。

答案 1 :(得分:2)

这是您选择的分析器的效果。

我相信default Analyzer只能索引符合/ [a-zA-Z] + /的字词。这意味着您的SSN未作为术语添加到索引中。

即使你切换到文本+数字不区分大小写的分析器,你想要的仍然无法工作。术语的表达式为/ [a-zA-Z0-9] + /这意味着您添加到索引中的术语将为12,123,1234。

如果您需要将123-12-1234视为有效术语,您可能需要扩展Zend_Search_Lucene_Analysis_Analyzer_Common并使其成为123-12-1234的术语。

请参阅 http://framework.zend.com/manual/en/zend.search.lucene.extending.html#zend.search.lucene.extending.analysis

您的另一个选择是将ssn存储为Zend_Search_Lucene_Field :: Keyword。由于关键字不会分解为术语。

http://framework.zend.com/manual/en/zend.search.lucene.html#zend.search.lucene.index-creation.understanding-field-types