Azure AI Searchを使ってベクター検索やらしてるわけですが、いろいろあって全データ見たいケースとかあるわけです。
で、以下のようなコードで検索して結果を得るわけですが(C#前提ですがクエリそのものは他の言語でも関係がないかと)
var options = new SearchOptions
{
QueryType = SearchQueryType.Semantic,
IncludeTotalCount = true,
Size = resultCount,
Skip = skip,
SemanticSearch = new()
{
SemanticConfigurationName = SemanticConfigName,
QueryCaption = new QueryCaption(QueryCaptionType.Extractive),
QueryAnswer = new QueryAnswer(QueryAnswerType.Extractive),
},
VectorSearch = new()
{
Queries =
{
new VectorizedQuery(vector)
{
KNearestNeighborsCount = 7,
Fields = { "vector" }
}
}
},
SearchFields = { "chunk" }
};
var response = await AzureSearchClient.SearchAsync<SomethingDocumentEntity>(question, options, cancellationToken);
await foreach (var result in response.Value.GetResultsAsync())
{
var doc = result.Document;
// something
}
await foreachでGetResultsAsync回すといい感じにページングの処理してくれます。大体のケースはまぁ問題なかったんですが、ある時1000件目以降の結果が取れないことに気付きました。ページ当たりの最大件数は1000件なのでそれは問題ないんですが、ページサイズが何件だろうと1000件目以降のデータがなんか空。エラーになったりはせず結果だけ空。(GetResultsAsyncの結果が空)
総件数をとるようにしてますが、データとしてはもっとあるのに、はて…という感じです。
結論からいうとベクター検索を含んでる場合は上記みたいな挙動になるようです?(まぁベクター検索のこと考えたらそんな件数まで計算していくのシンドイってのはわかる気がしますが)
というわけで1000件目以降の結果欲しいときはベクター検索をオフ(オプションのVectorSearchプロパティにnull)にすればいい感じです。
もうちょっとレスポンスに何か返すとか、ドキュメントに書くとかしてほしいですね。(どっかに書いてる?)