1

当我搜索“#”等特殊字符时,没有结果。

请注意,我已经转义了查询字符串。

但是,当与“c#”之类的字母组合时,Lucene 会找到该术语。

有没有办法搜索单个特殊字符?

这是我的片段:

Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength(1);

Zend_Search_Lucene_Analysis_Analyzer::setDefault(
    new \Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive());            

$index = Zend_Search_Lucene::create('/tmp/index');       
$doc = new Zend_Search_Lucene_Document;
$doc->addField(Zend_Search_Lucene_Field::Text('title', 'Some Title Here', 'UTF-8'))
    ->addField(Zend_Search_Lucene_Field::Text('content-01', '+ @ #', 'UTF-8'))
    ->addField(Zend_Search_Lucene_Field::Text('content-02', 'C+ C#', 'UTF-8'));        

$index->addDocument($doc);
$index->commit();

/* returns 0 results */
$r = $index->find("/#");
echo count($r) . "\n";

/* returns 1 results */
$r = $index->find('C#');
echo count($r) . "\n";

/* returns 1 results */
$r = $index->find('C+');
echo count($r) . "\n";

4

1 回答 1

4

根据这个页面的特殊字符列表如下:

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \

所以你不应该逃避#。但即使你不使用转义“斜线”,你仍然会得到 0 个结果。即使将Text字段类型更改为 ,也无法修复此行为Keyword

所以我开始研究它并运行这段代码:

echo('<pre>');
var_dump(Zend_Search_Lucene_Search_QueryParser::parse("#"));
echo('</pre>');
die();

它返回Zend_Search_Lucene_Search_Query_Boolean带有一个子查询Zend_Search_Lucene_Search_Query_Preprocessing_Term类型的对象。根据文档,有趣的是:

它是一个内部抽象类,旨在完成查询解析后的查询处理。

这种类型的查询实际上并不参与查询执行

所以我唯一的想法是:不要再使用默认解析器了!

所以我认为您的问题的解决方案很简单 - 使用查询构造 API手动创建查询:

$term  = new Zend_Search_Lucene_Index_Term("#");
$query = new Zend_Search_Lucene_Search_Query_Term($term);

/* still returns 0 results!! */
$r = $index->find($query);
echo('<pre>');
var_dump(count($r));
echo('</pre>');

但它不再起作用了!

我使它工作的唯一方法(也使用查询解析器)是添加以下行:

->addField(Zend_Search_Lucene_Field::keyword('content-03', '#'))

所以假设:特殊字符只能作为关键字搜索,因为这些字段没有被标记。但是关键字被视为一个完整的短语(即使里面有短语),这是一个巨大的限制。

于 2013-05-07T07:18:35.500 回答