问题:
我有一个巨大的特征向量表。向量中的每个元素由两个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个子列)。如您所见,随机列中的值可能会丢失,如果该元素没有该功能。
我想查询表格中的行X(不存在于表格中)以找到前N个(N = 10-20个)最佳匹配,使用一些定制的相似性函数f(vector1,vector2) do ==检查并返回相似性得分,考虑不同的权重,以匹配不同的列。
问题:
根据NoSQL数据库的说法,您认为哪种实现最适合这种情况?我想做实时查询。我正在考虑将HBase与Hadoop一起使用(或者使用带有Hadoop的MongoDB,哪一个更好?)并编写MapReduce作业以在每一行上执行相似性函数并获得结果。我很担心Hadoop的批处理工作是否能为我提供良好的实时性能(最长2秒)。我对Lucene没有多少经验 - 这会有什么用处吗?
除此之外,我是否有任何想法可以避免进行全表MapReduce扫描并以某种方式对其进行优化?
答案 0 :(得分:0)
在收到几位朋友的建议后,我查阅了ElasticSearch上的文档。似乎这是我的用例的完美工具。它专为搜索/检索需求而构建,像任何东西一样,可以处理大量数据。这是应该做的:
将每一行存储在文档中,其中键元素为_id字段,每个f1,f2 ...字段为不同字段。可以使用boost fields功能来增加某些字段的相关性(基本上为它们分配更多权重,基本上不需要我的相似性功能)。这甚至可以在query time期间完成,因此让用户根据用例分配权重。
这是一个示例查询,可能适用于此用例(未经测试):
{
"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" }
}
]
}
}
}'