当我搜索“#”等特殊字符时,没有结果出现。
请注意,我已经转义了查询字符串。
然而,当结合像“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";
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";
答案 0 :(得分:4)
根据这个page特殊字符列表如下:
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
所以你不应该逃避#
。但即使你不使用转义'斜线',你仍然会得到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
类型的子查询。根据{{3}}:
这是一个内部抽象类,旨在最终确定查询 查询解析后的处理。
此类查询 实际参与查询执行。
所以我唯一想到的是:不要在任何时候使用默认的游戏!
所以我认为您的问题的解决方案很简单 - 使用documentation手动创建查询:
$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', '#'))
因此假设:特殊字符只能作为关键字进行搜索,因为这些字段不是标记化的。但关键字被视为一个完整的短语(即使内部有短语),这是一个巨大的限制。