これがセットアップです。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がクエリを解析して検索を実行する方法で何かおかしなことが起こっています。
どんな助けでも大歓迎です。