我正在使用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
我做错了吗?如何在搜索请求中添加多个过滤器?
答案 0 :(得分:1)
这实际上是一个非常简单的修复......
您将在第二个中看到“Image.Filters = Size:Medium&amp; Image.Filters = Size:Small”图像过滤器位重复。将其更改为:
“Image.Filters =尺寸:中和安培;尺寸:小”
甚至:
“Image.Filters =尺寸:中和安培;小”
并且都返回结果。
答案 1 :(得分:0)
正如@Sid在评论中提到的那样,你不能使用两个尺寸的过滤器。
这些是AND过滤器,意味着您应用的每个过滤器都会使搜索更加严格和严格。 Bing读取您的请求,因为他们想要“小”和“中”的图像。当然,没有图像符合这两个标准,因此您得到一个空的结果集。
@gloscherrybomb认为他们的答案是有效的,因为bing只是忽略了“Size:Small”的最后一个参数或更简单的“Small”,它只提供中等结果。为什么?因为它正确地将Image.Filters参数读取为“Size:Medium”,然后文本的其余部分就是垃圾。 API文档明确指出过滤器必须使用加号,url编码连接,如下所示:
Image.Filters=Size:Medium%2BStyle:Photo
上面的“%2B”是url编码的加号,这就是Bing要求你连接多个过滤器的方式。但同样,您不能指定两种相同类型的图像过滤器,例如两个大小过滤器或两个样式过滤器。
有两种解决方法,我都不喜欢。第一种是两个请求,可能是并行的,一个是你想要的每个大小,然后加入结果。但是,如何在没有某种分数的情况下按相关性加入和排序两个单独的列表?
更简单的方法是完全跳过过滤,并请求比您需要的更多结果。然后根据您自己的尺寸要求过滤结果。如果你没有分页,这可能是最好的选择。