gpt4 book ai didi

elasticsearch - 在elasticsearch中查找最相似的整数数组

转载 作者:行者123 更新时间:2023-11-29 02:46:00 25 4
gpt4 key购买 nike

重写:

在我的项目中我有图像。每个图像有 5 个标签,范围 [1,10]。我使用 Elasticsearch 上传了这些标签:

我将这些文档加载到索引“my_project”中的 elasticsearch 中,类型为“img”:

curl -XPUT 'http://localhost:9200/my_project/img/1' -d '
{"tags": [1,4,6,7,9]}
'

我上传的其他示例文档:

{"tags": [1,4,6,7]}
{"tags": [2,3,5,6]}
{"tags": [1,2,3,8]}

在我的应用程序中,向量要长得多,但具有固定数量的唯一元素。我有大约 20M 的这些文件。

现在我想为给定的向量找到相似的文档。当向量有更多共同的标签时,它们更相似。因此,例如,我想为整数向量 [1,2,3,7] 找到最相似的文档。最佳匹配应该是最后一个示例文档 {"tags": [1,2,3,8]},因为它们在标签中共享 3 个共同值,[1,2,3 ],比任何其他向量都更常见的值。

所以这是我的问题。如果我使用上面的 CURL 命令上传文档,我会得到这个映射:

{
"my_project" : {
"mappings" : {
"img" : {
"properties" : {
"tags" : {
"type" : "string"
}
}
}
}
}
}

但我认为正确的映射应该使用整数而不是字符串。如何为此类数据做出正确的显式映射?

现在我想用上面的相似度算法搜索文档。如何使用上面解释的相似度算法获得 100 个最相似的上述类型文档?如果我将这些向量转换为以空格分隔的数字的字符串,我将能够使用带有 should 语句的 bool 查询来进行此搜索,但我认为使用整数数组应该更快。你能告诉我,我如何为 elasticsearch 构建搜索查询吗?


到目前为止我的解决方案

我现在使用的基本解决方案是将整数数组转换为字符串。所以我将文件保存为:

curl -XPUT 'http://localhost:9200/my_project/img/1' -d '
{"tags": "1 4 6 7 9"}
'

然后基本上搜索字符串 "1 2 3"。虽然这在某种程度上起作用,但我认为将整数数组保存为整数数组而不是字符串会更正确和更快。是否可以像处理整数数组一样在 elasticsearch 中处理整数数组?也许我使用字符串的方法是最好的并且不能/不必在 elasticsearch 中显式使用整数数组。

最佳答案

您可以使用 function score query 实现您想要的效果使用 Euclidian distance公式。

删除当前映射并索引文档:

curl -XPUT 'http://localhost:9200/my_project/img/1' -d '
{
"tags": {
"tag1": 1,
"tag2": 4,
"tag3": 6,
"tag4": 7
}
}'

curl -XPUT 'http://localhost:9200/my_project/img/2' -d '
{
"tags": {
"tag1": 2,
"tag2": 3,
"tag3": 5,
"tag4": 6
}
}'

curl -XPUT 'http://localhost:9200/my_project/img/3' -d '
{
"tags": {
"tag1": 1,
"tag2": 2,
"tag3": 3,
"tag4": 8
}
}'

停止 Elasticsearch 并在 $ES_HOME/config/scripts 中创建名为“euclidian_distance.mv​​el”的脚本文件并添加此脚本。

_score * pow(sqrt(pow(doc['tags.tag1'].value - param1, 2)) + sqrt(pow(doc['tags.tag2'].value - param2, 2)) + sqrt(pow(doc['tags.tag3'].value - param3, 2)) + sqrt(pow(doc['tags.tag4'].value - param4, 2)), -1)

重新启动 Elastisearch 并运行此查询:

curl -XPOST 'http://localhost:9200/my_project/' -d '
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"script_score": {
"script": "euclidian_distance",
"params": {
"param1": 1,
"param2": 2,
"param3": 3,
"param4": 7
}
}
}
}
}

首先返回值为1,2,3,8 的标签对象。

关于elasticsearch - 在elasticsearch中查找最相似的整数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24945500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com