ElasticSearch dense_vector向量查询-Java实现

这篇具有很好参考价值的文章主要介绍了ElasticSearch dense_vector向量查询-Java实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 简介

本文介绍如何使用ElasticSearch的Java High Level API执行向量查询,向量类型为dense_vector。

2. ElasticSearch 索引设计

PUT caster_vector1
{
  "settings": {
    "number_of_replicas": 0,
    "number_of_shards": 2
  },
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "dense_vector",
        "dims": 2
      },
      "my_text": {
        "type": "text"
      }
    }
  }
}

3. 向量查询

package com.example.elasticsearchdemo;

import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.ScriptScoreQueryBuilder;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptType;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class ESHighLevelRestQuery {
    public static void main(String[] args) throws IOException {
        // 创建一个RestHighLevelClient对象
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("192.168.209.3", 9200, "http")));

        // 定义索引名称和类型名称
        String indexName = "caster_vector1";
        String typeName = "_doc";
        //定义最低得分
        float minScore = 1.0f;

        //通过分页限制返回的文档数量
        int page = 0;
        int size = 5;

        // 定义查询向量
        double[] queryVector = new double[]{0, -1};
        // 创建一个查询脚本
        Map<String, Object> scriptParams = new HashMap<>();
        scriptParams.put("query_vector", queryVector);

       //指定向量属性的名字,通过余弦相似度来衡量查询得分
        Script script = new Script(ScriptType.INLINE, "painless",
                "cosineSimilarity(params.query_vector, 'my_vector') + 1.0", scriptParams);


        // 创建一个ScriptScoreQueryBuilder对象
        ScriptScoreQueryBuilder queryBuilder = QueryBuilders.scriptScoreQuery(
                QueryBuilders.matchAllQuery(),
                script);

        // 创建一个SearchRequest对象并设置索引名称、类型名称和查询条件
        SearchRequest searchRequest = new SearchRequest(indexName);
        searchRequest.types(typeName);
        searchRequest.source(new SearchSourceBuilder().query(queryBuilder).from(page).size(size).minScore(minScore));

       // 执行搜索操作
        try {
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

            // 处理搜索结果
            for (SearchHit hit : searchResponse.getHits().getHits()) {
                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                Float score = hit.getScore();
                System.out.println(sourceAsMap.toString() + ", score: " + score);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 关闭RestHighLevelClient对象
        client.close();

    }
}

在这个案例中,我们首先创建了一个RestHighLevelClient对象,并定义了索引名称和类型名称。
为了限制返回的文档数量, 我们设置了minScore,from,size变量。
然后,定义查询的向量,创建查询脚本,脚本中指定向量属性的名称,通过余弦相似度来衡量查询的得分。
接着,我们创建了一个ScriptScoreQueryBuilder对象和SearchRequest对象,执行搜索操作,我们将输出其错误信息,最后,关闭了RestHighLevelClient对象。文章来源地址https://www.toymoban.com/news/detail-716857.html

到了这里,关于ElasticSearch dense_vector向量查询-Java实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包