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のサブクエリが 1 つあるオブジェクトが返されました。そして、ドキュメント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 に答える