-5

问题:
我有一个巨大的特征向量表。向量中的每个元素都由两个 INTEGER 组成。这是一个例子:

-------------------------------------------------------------------------------
KEY |  VALUE
---------------------------------------------------------------------------------
    | f1    | f2    | f3    | f4    | f5       | f6       | f7    |  f8   | f9
---------------------------------------------------------------------------------
 1  | 13 42 |       | 546 43| 43 24 | 435  634 |          | 45  43|  4  5 | 5 647
 2  | 24 32 | 54 35 |       |       | 3124 32  | 454 3    | 4   5 |  12 1 |   
 3  | 3  1  | 54 32 |       | 43 24 |          | 31  2432 | 454 3 |  4  5 | 1 21    
---------------------------------------------------------------------------------

假设我有大约 1200 万行具有唯一键和大约 200 列(=400 个子列)。如您所见,如果该元素没有该功能,则可能会丢失随机列中的值。

我想使用一些定制的相似度函数 f(vector1, vector2) 来针对表查询行 X(表中不存在)以找到前 N (N = 10-20 可能)最佳匹配项 ==检查并返回考虑不同权重以匹配不同列的相似性分数。

问题:
就 NoSQL 数据库而言,您认为哪种实现最适合?我想进行实时查询。我正在考虑将 HBase 与 Hadoop 一起使用(或 MongoDB 与 Hadoop,哪个更好?)并编写一个 MapReduce 作业以在每一行上执行相似度函数并获得结果。我担心 Hadoop 的批处理主力能否为我提供良好的实时性能(最多 2 秒)。我对 Lucene 没有太多经验 - 这在这里有用吗?

除此之外,关于如何避免进行全表 MapReduce 扫描并以某种方式优化它的任何想法?

4

1 回答 1

0

在得到几个朋友的建议后,我查阅了 ElasticSearch 上的文档。似乎这是我用例的完美工具。它是为诸如此类的搜索/检索需求而构建的,像任何东西一样的分片,可以处理大量数据。这是应该做的:

将每一行存储在文档中,关键元素是 _id 字段,每个 f1、f2... 字段作为不同的字段。可以使用提升字段功能来增加某些字段的相关性(基本上为它们分配更多权重,基本上消除了对我的相似性函数的需要)。这甚至可以在查询时间完成,因此让用户根据用例分配权重。

这是一个示例查询,可能适用于此用例(未经测试):

{
  "query" : {
    "filtered" : {
        "and" : [
         {      
              "query" : {
                    "bool" : {
                         "should" : [
                              { "match" : { "f192" : { "boost" : 2,"query" : "232"} } },
                              { "match" : { "f16" : { "boost" : 1,"query" : "4324"} } },
                              { "match" : { "f25" : { "boost" : 0.2,"query" : "76783"} } },
                         ]
                    }
                }
         },
         {
              "exists" : { "field" : "f67" }
         }
       ]
    }
  }
}'
于 2013-07-22T19:59:31.307 回答