弹性搜索:特征向量相似性/重叠评分

时间:2017-03-20 20:43:26

标签: elasticsearch

方案

我有大约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

基于this link

的自定义相似度模块

将位位置转换为空格分隔的字符串并使用空格分析器。

硬件规格

Linode 12 GB配置,带有SSD磁盘和6 GB堆配置。

问题

  1. 如何将搜索速度提高到1秒以下?
  2. 我应该使用不同的映射吗?
  3. 如果我选择将2048个功能索引为位数组,是否可以选择执行BIT AND操作?

0 个答案:

没有答案