es實(shí)體類中對(duì)應(yīng)的字段
/**
* 向量徐块,用于knn撑瞧,其中type要設(shè)置為dense vector备畦,其他參數(shù)參考文檔预愤,
* 建議和我的一致崭捍,similarity設(shè)置為你需要的相似函數(shù)(歐幾里得或者cos)
* www.elastic.co/guide/en/elasticsearch/reference/8.12/dense-vector.html
*/
@Field(type = FieldType.Dense_Vector, dims = 1024, index = true, similarity = "cosine")
private List<Float> vector;
項(xiàng)目啟動(dòng)后spring data es會(huì)根據(jù)你的實(shí)體類生成對(duì)應(yīng)的索引渴丸,可以查看該索引中相應(yīng)字段的配置:
"vector": {
"type": "dense_vector",
"dims": 1024,
"index": true,
"similarity": "cosine"
}
knn搜索代碼:
BoolQuery.Builder bool = QueryBuilders.bool().boost(1.0f);
Query multiMatch = QueryBuilders.multiMatch()
.fields("name", "synonyms")
.query(name)
.fuzziness(condition.getFuzziness())
.operator(Operator.And)
.type(TextQueryType.BestFields)
.build()
._toQuery();
bool.must(multiMatch);
Query query = new Query(bool.build());
//調(diào)用embedding服務(wù)生成向量
Double[] v = EmbeddingUtils.vector(name);
List<Float> vector = Stream.of(v).map(Double::floatValue).toList();
//構(gòu)造knn查詢條件
KnnQuery knn = KnnQuery.of(k -> k.field("vector")
.boost(0.5f)
.k(20)
.numCandidates(6000)
.queryVector(vector)
);
NativeQueryBuilder nativeQueryBuilder = NativeQuery.builder()
.withPageable(condition.toPage())
.withQuery(query)
.withSort(scoreSort, timeSort, idSort)
.withTrackTotalHits(true)
.withKnnQuery(knnQuery)
.build();
SearchHits<Product> hits = esTemplate.search(nativeQuery, Product.class);
注意事項(xiàng)
spring data es要用最新版5.2.3以上氧敢,否則有bug