0

結果をオートコンプリート リストに返すために sphinx を使用しています。返された結果は、サーバーへの不必要なヒットを避けるためにクライアント側でキャッシュされます。

ロジックは次のとおりです。

  1. キャッシュされた結果に対してクライアント側の fuzzymatch アルゴリズムを実行し、オートコンプリートで表示する
  2. matches.length < 4 の場合、ajax リクエストを実行し、sphinx を使用して合計 4 までの結果を取得します
  3. 結果を返し、オートコンプリート リストに追加する

現在、ajax リクエストで、クライアント側のキャッシュで一致した ID の配列を送信し、PHP を使用してスフィンクスの結果をループし、一致から削除しています。

これは非効率的であるだけでなく、もちろん、結果を正しく制限することに関して問題を引き起こします。

私ができるようにしたいのは、制限句が実際に関連するように、Sphinx の一致自体からこれらの特定の ID を除外することです。

実際の問題は、PHP API を使用して Sphinx クエリ内で特定の ID を除外するにはどうすればよいかということです。例: 「次の ID のいずれかを持っている場合を除き、ユーザー名 John と一致するものをすべて検索します....」

私はスフィンクスのドキュメントをよく読んで、「拡張モード」のマッチングとさまざまな演算子の使用についてかなりの量を読みましたが、かなり混乱していて、どうすればよいかわかりません。

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

4

2 に答える 2

2

スフィンクスでそれを行う良い方法は次のとおりです。

「現在、ajax リクエストで、クライアント側のキャッシュで一致した ID の配列を送信し、PHP を使用してスフィンクスの結果をループし、一致から削除しています。」

スフィンクスでsetfilterを使用する必要があります

$cl->SetFilter ( $attribute, $values, $exclude=false );

ここで $cl は sphinx クラスのオブジェクトです

$attribute は、フィルターを適用する属性名です。

$values は、整数値を含むプレーンな配列でなければなりません。(ここで配列を渡すことができます)

exclude これは非常に重要なパラメーターです。配列 (3 番目のパラメーター) で提供した結果からすべての ID を除外する場合は、true に設定します。

例: $cl->SetFilter ( $attribute, $values, true);

この助けを願っています!!

于 2012-10-15T09:50:09.303 に答える
2
$cl->setFilter("id",array(12,45,34,67,34),TRUE);

:)

于 2012-10-15T09:50:41.877 に答える