1. 簡介
本文介紹如何使用ElasticSearch的Java High Level API執(zhí)行向量查詢,向量類型為dense_vector。文章來源:http://www.zghlxwxcb.cn/news/detail-716857.html
2. ElasticSearch 索引設(shè)計(jì)
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 {
// 創(chuàng)建一個(gè)RestHighLevelClient對(duì)象
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;
//通過分頁限制返回的文檔數(shù)量
int page = 0;
int size = 5;
// 定義查詢向量
double[] queryVector = new double[]{0, -1};
// 創(chuàng)建一個(gè)查詢腳本
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);
// 創(chuàng)建一個(gè)ScriptScoreQueryBuilder對(duì)象
ScriptScoreQueryBuilder queryBuilder = QueryBuilders.scriptScoreQuery(
QueryBuilders.matchAllQuery(),
script);
// 創(chuàng)建一個(gè)SearchRequest對(duì)象并設(shè)置索引名稱、類型名稱和查詢條件
SearchRequest searchRequest = new SearchRequest(indexName);
searchRequest.types(typeName);
searchRequest.source(new SearchSourceBuilder().query(queryBuilder).from(page).size(size).minScore(minScore));
// 執(zhí)行搜索操作
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 處理搜索結(jié)果
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();
}
// 關(guān)閉RestHighLevelClient對(duì)象
client.close();
}
}
在這個(gè)案例中,我們首先創(chuàng)建了一個(gè)RestHighLevelClient對(duì)象,并定義了索引名稱和類型名稱。
為了限制返回的文檔數(shù)量, 我們?cè)O(shè)置了minScore,from,size變量。
然后,定義查詢的向量,創(chuàng)建查詢腳本,腳本中指定向量屬性的名稱,通過余弦相似度來衡量查詢的得分。
接著,我們創(chuàng)建了一個(gè)ScriptScoreQueryBuilder對(duì)象和SearchRequest對(duì)象,執(zhí)行搜索操作,我們將輸出其錯(cuò)誤信息,最后,關(guān)閉了RestHighLevelClient對(duì)象。文章來源地址http://www.zghlxwxcb.cn/news/detail-716857.html
到了這里,關(guān)于ElasticSearch dense_vector向量查詢-Java實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!