必应API图像搜索过滤

3

我正在使用Bing Sharp 2.0。我想通过筛选器进行图片搜索,所以我按照示例中的代码操作:

SearchRequest searchRequest = new SearchRequest { AppId = appId, Query = query, Market = "en-US" };
ImageRequest imageRequest = new ImageRequest();
imageRequest.Filters = buildFilterArray();
imageRequest.Count = imageCount;
imageRequest.Offset = (imageCount * pageNumber);
ImageResponse response = API.Image(searchRequest, imageRequest);

这是buildFilterArray函数:

private string[] BuildFilterArray()
{
    List<string> filters = new List<string>();
    filters.Add("Size:Small");
    filters.Add("Size:Medium");
    return filters.ToArray();
}

但结果什么也没有返回(response.Total == 0)。

我发现原因是因为我在buildFilterArray()中指定了2个过滤器,只要我删除一个(无论哪一个),我的搜索就会得到预期的结果。

这也通过直接从IE发出http get请求证明了,这将返回结果:

http://api.search.live.net/xml.aspx?AppId=0B409D9BA6759BCD3CC3D8B9A6A90F2907274BC7&Query=tektronix&Version=2.0&Market=en-US&Sources=Image&Image.Count=10&Image.Offset=0&Image.Filters=Size:Small

虽然这样不行:
http://api.search.live.net/xml.aspx?AppId=0B409D9BA6759BCD3CC3D8B9A6A90F2907274BC7&Query=tektronix&Version=2.0&Market=en-US&Sources=Image&Image.Count=10&Image.Offset=0&Image.Filters=Size:Medium&Image.Filters=Size:Small

我是否做错了什么?我如何将多个过滤器放入搜索请求中?


我想在iOS应用程序中集成相同的API。请问你能指导我在哪里注册我的应用程序吗? - Murali
2个回答

1

这实际上是一个非常简单的修复...

你会在第二个中看到 "Image.Filters=Size:Medium&Image.Filters=Size:Small",图像过滤器部分被重复了。将其更改为:

"Image.Filters=Size:Medium&Size:Small"

或者甚至:

"Image.Filters=Size:Medium&Small"

并且两者都返回结果。


1
正确的添加多个过滤器的方式是 "Image.filters=Size:Medium&Image.filters=Face:Face"。在 Size:Medium 和 Size:Large 上的过滤器不重叠,会导致一个空集。 - Sid

0

正如@Sid在评论中提到的那样,您不能使用两个大小过滤器。

这些是AND过滤器,意味着您应用的每一个都会使搜索变得更加严格。Bing将您的请求解读为希望获得既“小”又“中”的图像。当然,没有图像能同时满足这两个条件,因此您会得到一个空结果集。

@gloscherrybomb认为他们的答案有效,因为bing只是忽略了“Size:Small”或者更简单的“Small”的最后一个参数,而只提供中等大小的结果。为什么?因为它正确地将Image.Filters参数解读为“Size:Medium”,然后剩下的文本就是垃圾了。API文档明确指出,过滤器必须使用加号连接,并进行URL编码,如下所示:

Image.Filters=Size:Medium%2BStyle:Photo

上面的"%2B"是url编码的加号,这就是Bing要求您连接多个过滤器的方式。但是,您不能指定两个相同类型的图像过滤器,比如两个大小过滤器或两个样式过滤器。
有两种解决方法,我都不太喜欢。第一种是进行两个请求,可能是并行的,一个请求每个所需的大小,然后将结果合并。但是,如果没有某种得分,如何按相关性连接和排序两个单独的列表?
更简单的方法是跳过过滤,请求比您需要的结果更多。然后根据自己的大小要求过滤结果。如果您没有分页,这可能是最好的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接