方案
我有大约2500万个产品,每个产品我生成了2048位功能(2048个真/假布尔值)。我为每个产品生成了一个位数组。
示例向量:[0 1 1 0 1 0 1 1 0 0 0 ... 0 0 0 1]
问题
我试图根据重叠的常见功能的数量找到文档中的匹配项。鉴于产品“A'”,我想根据功能的数量找到最相似的产品。没有重要的功能,没有术语频率或idf是必要的。问题是我能够在不到1秒的时间内找到匹配的方法。
我的方法1
为每个产品创建2048个字段并存储。找到特定产品的相似性时,只需查询bool值为true的字段。
文档结构
{
"doc_id": "001",
"feature_0001": true,
"feature_0002": false,
"feature_0003": true,
.
.
.
"feature_2048": false
}
查询
{
"query": {
"bool": {
"must": [
{
"match": {
"feature_0001": true
}
},
.
.
.
{
"match": {
"feature_0003": true
}
}
]
}
}
}
我的方法2
基于这个SO答案(https://stackoverflow.com/a/39112733/1179958) 为位位置为ON的整数创建一个数组。
文档结构
{
"doc_id": "001",
"positions": [0, 2, ... , 2045]
}
查询
{
"query": {
"bool": {
"must": [
{
"terms": {
"positions": [2, 3, 6, ... , 2046]
}
}
]
}
}
}
我的方法3
与方法2相同,除了对每个整数使用多个术语查询而不是单个术语查询[结果表明它有轻微的性能改进,我没有预料到]
我的方法4
的自定义相似度模块将位位置转换为空格分隔的字符串并使用空格分析器。
硬件规格
Linode 12 GB配置,带有SSD磁盘和6 GB堆配置。
问题