哈希检查方法中的子句mongodb和linq



我的集合包含图像和DCT哈希。我如何在linq中仅使用相似性(长哈希,长自哈特)方法选择相似的图像。
此查询不起作用:

var results = imageCollection
.AsQueryable()
.Where(x=>ImageHash.Similarity(x.Hash, hash) >= 50)
.ToList();

序列化误差发生。

谢谢!

请记住,您对MongoDB编写的任何LINQ查询最终都必须在MongoDB查询语言中翻译成同等的查询。您编写的LINQ查询不能翻译成RAW MONGODB查询,因为此部分:

.Where(x=>ImageHash.Similarity(x.Hash, hash) >= 50)

在MongoDB查询语言中没有等效。

您将要做的就是获取所有图像_id和哈希值客户端并运行您的相似性标准客户端。一旦拥有所有相似的图像的_id值,您就可以自己获取图像。

希望您的查询还将包含其他条件,因此只需要通过相似性标准客户端运行图像的一个子集。

它看起来或多或少都这样:

var matchingIds = collection.FindAllAs<BsonDocument>
    .SetFields("_id", "Hash")
    .AsEnumerable() // force client side evaluation of the rest of the query
    .Where(x => ImageHash.Similarity(x["Hash"].AsByteArray, hash) > 50))
    .Select(x => x["_id"]);
var query = Query.In("_id", matchingIds);
var matchingImages = collection.Find(query);
foreach (var image in matchingImages)
{
    // process matching image
}

正如您在评论中所说的那样,您是否尝试过POCO类?

public class MyImage
{
 [BsonId]
 public ObjectId id {get;set;}    
 public string Hash {get;set;}
}
var results = imageCollection
 .AsQueryable(MyImage)
.Where(x=>ImageHash.Similarity(x.Hash, hash) >= 50)
.ToList();

相关内容

  • 没有找到相关文章

最新更新