有关Elasticsearch模式和查询的问题

时间:2019-04-29 23:46:39

标签: java database amazon-web-services elasticsearch schema

我正在建立一个Elasticsearch集群来搜索与id相关的向量。

例如

提供此数据:

Parent id / Object id / vectors
P1 / BD / 123, 125, 235 ... 10304, 50305 
P1 / DF / 125, 235, 240 ... 10305, 10306
P1 / ED / 123, 235, 350 ... 10010, 10344
... 
P2 / AB / 125, 535, 740 ... 9315, 10306
P2 / VC / 133, 435, 350 ... 3010, 20344
P2 / RF / 113, 353, 390 ... 10110, 30344
...
There are millions of parents
hundreds of objects in a parent
1000 vectors in an object

所以基本上我想

  1. 索引所有向量
  2. 给定输入P999,通过查找数量最多的相似对象从集群中搜索相似的父对象。 (相似的对象:至少50个向量匹配项)

这是我期望的示例结果

Input:
P999 / HH / xxx, xxx ...
P999 / YH / xxx, xxx ...
P999 / GJ / xxx, xxx ...
...
Output:
[result sorted desc] 
P20 has 60 similar objects
P4 has 45 similar objects
P501 has 41 similar objects
...

similar objects: at least 50 vector matches

为此, 我需要

  1. 好的架构
  2. 存储向量的查询
  3. 以降序搜索相似对象列表的查询

在这三个方面,我需要一些帮助。

  1. 架构
curl -XPOST url/vectors -d '{
  "mappings" : {
    "properties": {
      "object_id":{"type":"text"},
      "parent_id":{"type":"text"},
      "vectors":{"type":"text"}
    }
  }
}'
  1. 插入查询
curl -XPUT url/vectors -d '{
  "parent_id":"P1",
  "object_id":"BD",
  "vectors":"123, 125, 235 ... 10304, 50305"}
}'
  1. 搜索查询
curl -XGET url/vectors -d '{
  "size":10000,
  "query" {
    "function_score": {
      "functions": [
        {
          ???        
        }
      ],
      "query": {
        "bool": {
          "should": [
            { "terms"{"vectors":["111"] },
            { "terms"{"vectors":["222"] },
            ...
            { "terms"{"vectors":["333"] },
            { "terms"{"vectors":["444"] }
          ]         
        }      
      },
      "minimum_should_match": "50",
    }
  },
  "from": 0,
  "sort": 
  [
    {
      "_score": {
        "order": "desc"
      }
    }
  ]
}'

我的问题是

  1. 在我的模式映射中,这是存储向量的正确方法吗?
  2. 在我的搜索查询中,我需要[???]部分的帮助以获取预期的结果。我什至不确定自己是否走对了。如果错误,您会更正我的查询吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我怀疑您可以使用纯Elasticsearch查询获得所需的输出。

我要做的是拥有一个Python脚本,该脚本可以以编程方式更改要搜索的向量。然后取决于响应的大小,您可能需要使用Scan API才能返回所有匹配项 您的最终查询看起来像这样

"query" : {
    "bool" : {
        "should" : [
            //THIS IS THE PART THAT YOU PROGRAMATICALLY FILL USING THE VECTORS FROM THE PARENT YOU SPECIFIED
            {"match" : {"vector" : "111"}},
            {"match" : {"vector" : "222"}},
            {"match" : {"vector" : "333"}},
            ...
            {"match" : {"vector" : "444"}},
        ],
      "minimum_should_match": "50"
    }
}

然后您将使用python确定P999和所有匹配项之间的匹配向量数

是否有您不使用图形数据库的原因?使用图形数据库可以更容易,更快捷地找到这种关系。

如果必须使用功能评分,请将其添加到上面的查询中。

它应该做的是为每个匹配的文档添加权重,但是我相当确定它会添加查询本身将对文档进行评分非常好

        "function_score": {
          "query": { "match_all": {} },
          "boost": "5", 
          "functions": [
              {
                  "filter": { "match": { "vector": "111" } }, 
                  "weight": 1
              },
              {
                  "filter": { "match": { "vector": "222" } },
                  "weight": 1
              }
              ...
          ],
          "max_boost": 1,
          "score_mode": "max",
          "boost_mode": "replace",
          "min_score" : 0
        }