【问题标题】:Bing API image search filter必应 API 图像搜索过滤器
【发布时间】:2011-05-07 09:44:57
【问题描述】:

我正在使用 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。你能指导我在哪里注册我的应用程序吗?

标签: c# search bing bing-api


【解决方案1】:

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

您将在第二个“Image.Filters=Size:Medium&Image.Filters=Size:Small”中看到图像过滤器位重复。改成:

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

甚至:

"Image.Filters=Size:Medium&Small"

两者都返回结果。

【讨论】:

  • 添加多个滤镜的正确方法是“Image.filters=Size:Medium&Image.filters=Face:Face”。 Size:Medium 和 Size:Large 上的过滤器不重叠,会产生一个空集
【解决方案2】:

正如@Sid 在评论中提到的,你不能使用两个尺寸的过滤器。

这些是 AND 过滤器,这意味着您应用的每个过滤器都会使搜索变得越来越严格。 Bing 将您的请求读取为想要“小”和“中”的图像。当然,没有图像会同时满足这两个条件,因此您会得到一个空的结果集。

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

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

上面的“%2B”是 url 编码的加号,这是 Bing 要求您连接多个过滤器的方式。但同样,您不能指定两个相同类型的图像过滤器,例如两个尺寸过滤器或两个样式过滤器。

有两种解决方法,我都不喜欢。第一个是发出两个请求,可能是并行的,一个针对您想要的每个大小,然后加入结果。但是,如何在没有某种分数的情况下按相关性对两个单独的列表进行连接和排序呢?

更简单的方法是完全跳过过滤,并请求比您需要的更多的结果。然后根据您自己的尺寸要求过滤结果。如果你不分页,这可能是最好的选择。

【讨论】: