2

これがセットアップです。Luceneインデックスがあり、インデックスを作成した2,000のドキュメントでうまく機能します。私はLuke(Lucene Index Toolbox、v.0.9.2)を使用してクエリをデバッグしており、ZF1.9を使用しています。

LuceneIndexのレイアウトは次のとおりです。

I = Indexed
T = Tokenized
S = Stored

Fields:
author - ITS
category - ITS
publication - ITS
publicationdate - IS
summary - ITS
title - ITS

基本的に、上記のフィールドで検索できるフォームがあり、上記の情報のいずれかを組み合わせて一致させることができ、それをzendluceueクエリに解析します。それは問題ではありません。問題は、用語の組み合わせを開始したときに、検索内で起動する「最適化」メソッドによってクエリが消えてしまうことです。

これが私が今実行している検索の例です:

フォームバージョン

Title: test title
Publication: publication name

Luceneクエリ解析

+(title:test title) +(publication:publication name)

ここで、このクエリ文字列を取得してLUKEにスラップし、[検索]をクリックすると、問題なく結果が返されます。Query Findメソッドを使用すると、爆破します。それで私はそれがどのように機能するかについて少し研究し、問題を見つけました(私は信じています)

まず、検索を実行する実際のコード行を次に示します。

$searchQuery = "+(title:test title) +(publication:publication name)";
$hits = new ArrayObject($this->index->find($searchQuery));  

これは実際のコードの簡略化されたバージョンですが、それが生成されます。

ここで、デバッグ後に気付いたことがあります。「optimize」メソッドは、クエリ自体を破棄するだけです。次のコードを作成しました。

$rewrite = $searchQuery->rewrite($this->index);
$optimize = $searchQuery->rewrite($this->index)->optimize($this->index); 
echo "======<br/>";
echo "Original: ".$searchQuery."<br/>";
echo "Rewrite: ".$rewrite."<br/>";
echo "Optimized + Rewrite: ".$optimize."<br/>";
echo "======<br/>";  

次のテキストを出力します。

======
Original: +(title:test title) +(publication:publication name)
Rewrite: +(title:test title) +(publication:publication name)
Optimized + Rewrite: 
======

3番目の出力が完全に空になっていることに注目してください。クエリの書き換えと最適化により、クエリ文字列が空になっているようです。

最適化メソッドがクエリをまとめて削除しているように見える理由を誰かが知っていますか?解析が必要になる可能性のあるフィルターまたはある種のインターフェースがありませんか?LUKEに貼り付けて手動でインデックスに対して実行すると、すべてのクエリが完全に機能しますが、Zendがクエリを解析して検索を実行する方法で何かおかしなことが起こっています。

どんな助けでも大歓迎です。

4

1 に答える 1

6

率直に言って、Zend_Search_Lucene (ZSL) にはバグがあり、長い間メンテナンスされていません。

概念的にも間違っています。理由を説明しましょう。検索エンジンは検索クエリにすばやく応答するために存在します。ZSL の問題は、ZSL が純粋な PHP で実装されていることです。これは、すべてのクエリで、すべてのインデックス ファイルが継続的に読み取られ、再度再ロードされることを意味します。速くなることはできません。

Lucene 自体には何の問題もありません。Lucene に基づいたSolrという名前の非常に優れた代替手段もあります。これは Java で実装された検索サーバーであり、すべての Lucene クエリにインデックスを付けて応答することができます。Solr のサーバーの性質により、すべての Lucene ファイルを何度も再読み込みしてもパフォーマンスが低下することはありません。

これはあなたが尋ねたものとは多少異なります.ZSLのバグが解決されるのを2年間待ちました.Solrを使用する場合です:)

于 2009-11-03T20:48:20.847 に答える