1. 创建数据
POST product-index/_bulk?refresh=true
{ "index": { "_id": "1" } }
{ "product-vector": [230.0, 300.33, -34.8988, 15.555, -200.0], "price": 1599 }
{ "index": { "_id": "2" } }
{ "product-vector": [-0.5, 100.0, -13.0, 14.8, -156.0], "price": 799 }
{ "index": { "_id": "3" } }
{ "product-vector": [0.5, 111.3, -13.0, 14.8, -156.0], "price": 1099 }
...
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
  1. 使用search API运行包含向量函数script_score查询。
    向量函数的类型有:
    1. cosineSimilarity-计算余弦相似度
    2. dotProduct-计算点积
    3. l1 norm-计算L1距离
    4. Hamming-计算Hamming距离
    5. l2 norm-计算L2距离
    6. doc[].vectorValue-以浮点数组的形式返回向量的值
    7. doc[].magnitude-返回向量的大小
      接下来以cosineSimilarity为例,这是一个通过计算两个向量的余弦大小来判断向量相似度的函数。我们通过传入的参数向量queryVector,这个名称是自定义的,但是需要与source的脚本中params.queryVector一致,下面方法将会查询所有文档
POST product-index/_search
{
  "query": {
    "script_score": {
      "query" : {
        "match_all" : {}
       },
      "script": {
        "source": "cosineSimilarity(params.queryVector, 'product-vector') + 1.0",
        "params": {
          "queryVector": [-0.5, 90.0, -10, 14.8, -156.0]
        }
      }
    }
  }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

但是使用match_all查询来全量匹配所有文档会显著增加搜索延迟,为了限制传递给vector函数的匹配文档的数量,可以在script_score.query参数中指定一个过滤查询。例如下面示例:

POST product-index/_search
{
  "query": {
    "script_score": {
      "query" : {
        "bool" : {
          "filter" : {
            "range" : {
              "price" : {
                "gte": 1000
              }
            }
          }
        }
      },
      "script": {
        "source": "cosineSimilarity(params.queryVector, 'product-vector') + 1.0",
        "params": {
          "queryVector": [-0.5, 90.0, -10, 14.8, -156.0]
        }
      }
    }
  }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

2.3 两种搜索的对比

原理差异

性能表现

适用场景

  1. 用精确搜索的情况
  1. 用近似搜索的情况

精确的强力kNN保证了准确的结果,但无法很好地扩展大型数据集。如果必须要使用精确暴力搜索,您可以通过使用查询参数来限制传递给函数的匹配文档的数量。如果过滤数据到一个小的文档子集,就可以得到很好的搜索结果。

三、Elasticsearch支持的其他语义搜索方式

Elasticsearch使用自然语言处理(NLP)和向量搜索提供各种语义搜索功能。使用NLP模型使您能够从文本中提取文本嵌入。嵌入是提供文本的数字表示的向量。具有相似含义的内容片段具有相似的表示。

Elasticsearch中的semantic_text字段也支持语义文本搜索。在使用时只需要将文档的字段设置为semantic_text, 不需要指定如何为数据生成嵌入,或者如何对其进行索引。推理端点自动确定要使用的嵌入生成,索引和查询。
在这里插入图片描述

翻译 警告:此功能处于测试阶段,可能会发生变化。设计和代码不如官方GA功能成熟,并且按原样提供,没有任何保证。Beta版功能不受正式GA功能的支持SLA的限制。使用时需要注意风险

使用

  1. 创建Index Mapping
    默认是使用预配置的.elser-2-elasticsearch端点,使用以下API请求设置semantic_text
PUT semantic-embeddings
{
  "mappings": {
    "properties": {
      "content": {
        "type": "semantic_text"
        //"inference_id": "my-elser-endpoint", 默认是使用预配置的``.elser-2-elasticsearch``端点,也可以自己设置推理端点
      }
    }
  }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
  1. 加载数据
    将文档添加到索引时,Elasticsearch 会自动使用指定的推理端点计算嵌入,并将其存储在 semantic_text 字段中。您无需手动生成嵌入向量。以下是索引文档的示例:
PUT semantic-embeddings/_doc/1
{
  "content": "Elasticsearch 8.17 introduces semantic search capabilities."
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
  1. 语义搜索
GET semantic-embeddings/_search
{
  "query": {
    "semantic": {
      "field": "content",
      "query": "如何在跑步时避免肌肉酸痛?"
    }
  }
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

使用嵌入丰富数据集之后,可以使用语义搜索查询数据。在语义查询类型中提供semantic_text字段名称和查询文本。用于为semantic_text字段生成嵌入的推理端点将用于处理查询文本。

通过上述步骤,您可以在 Elasticsearch 8.17 中利用 semantic_text 字段实现高效的语义搜索功能。该功能使搜索更加智能,能够理解查询的意图和上下文,从而提供更相关的搜索结果。

向量搜索典型应用场景

data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/qq2632246528/article/details/145972016","extend1":"pc","ab":"new"}">> id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"> class="blog_extension blog_extension_type1" id="blog_extension"> class="blog_extension_card" data-report-click="{"spm":"1001.2101.3001.6470"}" data-report-view="{"spm":"1001.2101.3001.6470"}"> class="blog_extension_card_left"> class="blog_extension_card_cont"> class="blog_extension_card_cont_l"> 程序员大任 class="blog_extension_card_cont_r"> 微信公众号 程序员大任,分享知识~
注:本文转载自blog.csdn.net的程序员大任的文章"https://blog.csdn.net/qq2632246528/article/details/145972016"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!