0

メインとデルタの 2 つのインデックスが構成されたスフィンクス インスタンスがあります。どちらもSQLクエリ範囲を持っています。

デルタ インデックスには、変更された記事をメイン インデックスから削除する killlist クエリがあります。

このクエリは、コンテンツ クエリのように範囲指定する必要がありますか?

すなわち

source delta : main {
  sql_query_range   = SELECT MIN(id),MAX(id) FROM documents
  sql_range_step = 1000

  sql_query = SELECT * FROM documents WHERE id>=$start AND id<=$end WHERE ID > (SELECT maxID from SphinxTable)

  sql_query_killlist = SELECT id FROM documents WHERE id>=$start AND id<=$end WHERE ID > (SELECT maxID from SphinxTable)
 }
4

1 に答える 1

2

このクエリは、コンテンツ クエリのように範囲指定する必要がありますか?

いいえ、キルリストは範囲指定クエリをサポートしていません。1 つのクエリを実行するだけです。

ちなみに、これ:

sql_query_range = SELECT MIN(id),MAX(id) FROM ドキュメント

間違っているように見えます。これは、ドキュメント テーブルからすべての ID を取得しています。ただし、sql_query には、SphinxTable の maxID を使用する追加の計算があります。

次のようなものでなければなりません

sql_query_range   = SELECT (SELECT maxID from SphinxTable),MAX(id) FROM documents

そうしないと、大量のクエリを発行することになります-メインになるドキュメントをフェッチするため、2番目のカリスのために一致することはありません.

だからただする

sql_query = SELECT * FROM documents WHERE id>=$start AND id<=$end WHERE ID > (SELECT  maxID from SphinxTable) OR updated > (SELECT updatedts FROM SphinxTable)
sql_query_killlist = SELECT id FROM documents WHERE id <= (SELECT maxID from SphinxTable) AND updated > (SELECT updatedts FROM SphinxTable)

平等の変化に注意してください。キリングリストのメインにあるドキュメントが必要です。しかし、前回の再インデックス以降に更新されたドキュメントのみが必要な場合もあります。

于 2012-09-13T11:33:05.323 に答える