La recherche vectorielle avec le SDK Tablestore pour Java renvoie les données les plus proches d'un index de recherche en se basant sur la similarité vectorielle. Elle prend en charge les seuils de score, le nombre de candidats et les filtres non vectoriels.
Prérequis
Installez le SDK Tablestore pour Java et initialisez le client. La recherche vectorielle nécessite la version 5.17.0 ou ultérieure.
Pour configurer
minScoreounumCandidates, utilisez la version 5.17.5 ou ultérieure.
Description de la fonctionnalité
La recherche vectorielle effectue une recherche des voisins les plus proches (ANN) entre un vecteur de requête et les vecteurs d'un champ Vector. Tablestore attribue un score aux résultats selon la métrique de distance configurée lors de la création de l'index de recherche et renvoie les données les plus proches. Contrairement aux requêtes qui filtrent sur des valeurs de champ, la recherche vectorielle détermine la similarité à partir de la distance entre les vecteurs.
Appelez search et définissez query sur KnnVectorQuery.
SearchResponse search(SearchRequest request)
L'exemple suivant récupère les trois vecteurs du champ embedding les plus proches de [1.0, 0.0, 0.0, 0.0]. Les résultats sont triés par score décroissant.
String tableName = "example_table";
String indexName = "example_index";
KnnVectorQuery query = new KnnVectorQuery();
query.setFieldName("embedding");
query.setTopK(3);
query.setFloat32QueryVector(new float[]{1.0f, 0.0f, 0.0f, 0.0f});
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(query);
searchQuery.setLimit(3);
searchQuery.setSort(new Sort(Collections.singletonList(new ScoreSort())));
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
columnsToGet.setReturnAll(true);
request.setColumnsToGet(columnsToGet);
SearchResponse response = client.search(request);
for (SearchHit hit : response.getSearchHits()) {
System.out.println(hit.getScore() + ": " + hit.getRow());
}
Des limites s'appliquent au nombre et aux dimensions des champs vectoriels ainsi qu'à topK. Pour plus de détails, consultez les Limites des index de recherche.
Paramètres
Requête de recherche
request est un objet SearchRequest contenant les paramètres suivants.
|
Nom |
Type |
Description |
|
tableName (obligatoire) |
String |
Nom de la table. |
|
indexName (obligatoire) |
String |
Nom de l'index de recherche. |
|
searchQuery (obligatoire) |
SearchQuery |
Condition de requête et configurations courantes. |
|
columnsToGet (facultatif) |
SearchRequest.ColumnsToGet |
Configuration des colonnes renvoyées. Si ce paramètre n'est pas défini, seules les colonnes de clé primaire sont renvoyées. |
|
timeoutInMillisecond (facultatif) |
int |
Délai d'expiration de la requête en millisecondes. Valeur par défaut : |
|
routingValues (facultatif) |
|
Valeurs de clé primaire des champs de routage personnalisés. Laissez ce paramètre vide si le routage personnalisé n'est pas configuré. |
Configuration de la requête
request.searchQuery est un objet SearchQuery contenant les paramètres suivants.
|
Nom |
Type |
Description |
|
query (obligatoire) |
Query |
Condition de requête. Définissez ce paramètre sur |
|
offset (facultatif) |
Integer |
Position de départ de la requête. |
|
limit (facultatif) |
Integer |
Nombre maximal de lignes à renvoyer. Si ce paramètre est défini sur |
|
highlight (facultatif) |
Highlight |
Configurations de résumé et de mise en surbrillance. Les champs vectoriels ne prennent pas en charge ces fonctionnalités. |
|
collapse (facultatif) |
Collapse |
Configuration de réduction pour dédupliquer les résultats selon une colonne spécifiée. |
|
sort (facultatif) |
Sort |
Ordre de tri des résultats. Utilisez |
|
trackTotalCount (facultatif) |
int |
Nombre maximal de lignes correspondantes à compter. Valeur par défaut : |
|
filter (facultatif) |
SearchFilter |
Filtre appliqué aux résultats de |
|
aggregationList (facultatif) |
|
Configurations d'agrégation. |
|
groupByList (facultatif) |
|
Configurations de regroupement. |
|
token (facultatif) |
byte[] |
Jeton de pagination. Définissez ce paramètre sur le |
Condition de requête vectorielle
request.searchQuery.query est un objet KnnVectorQuery contenant les paramètres suivants.
|
Nom |
Type |
Description |
|
fieldName (obligatoire) |
String |
Nom du champ vectoriel. Le champ doit être de type Vector et la dimension du vecteur de requête doit correspondre à celle configurée lors de la création de l'index de recherche. |
|
topK (obligatoire) |
Integer |
Nombre de vecteurs les plus proches à récupérer. Maximum : |
|
float32QueryVector (obligatoire) |
float[] |
Vecteur de requête Float32 utilisé pour calculer la similarité. La longueur du tableau doit correspondre à la dimension du champ vectoriel. |
|
filter (facultatif) |
Query |
Conditions de requête non vectorielles que les résultats de la recherche vectorielle doivent également respecter. Vous pouvez combiner plusieurs objets |
|
weight (facultatif) |
Float |
Poids de pertinence de la requête vectorielle. La valeur doit être supérieure ou égale à |
|
minScore (facultatif) |
Float |
Seuil de score minimum. La valeur doit être supérieure ou égale à |
|
numCandidates (facultatif) |
Integer |
Nombre de candidats consultés dans chaque partition d'index lors du calcul des voisins les plus proches. Valeurs valides : |
Colonnes renvoyées
request.columnsToGet est un objet SearchRequest.ColumnsToGet contenant les paramètres suivants.
|
Nom |
Type |
Description |
|
columns (facultatif) |
|
Colonnes d'attribut à renvoyer. Configurez ce paramètre uniquement si |
|
returnAll (facultatif) |
boolean |
Indique s'il faut renvoyer toutes les colonnes d'attribut de la table. Valeur par défaut : |
|
returnAllFromIndex (facultatif) |
boolean |
Indique s'il faut renvoyer toutes les colonnes d'attribut indexées. Valeur par défaut : |
Réponse
Réponse de recherche
search renvoie un objet SearchResponse. Le tableau suivant décrit les champs principaux.
|
Nom |
Type |
Description |
|
totalCount |
long |
Nombre de lignes correspondantes. Appelez |
|
rows |
|
Lignes renvoyées par cette requête. Appelez |
|
searchHits |
|
Résultats de la requête. Appelez |
|
nextToken |
byte[] |
Jeton pour la page suivante. Appelez |
|
isAllSuccess |
boolean |
Indique si toutes les partitions d'index ont été interrogées. Appelez |
Résultat de recherche
Chaque élément de response.searchHits[] est un objet SearchHit contenant les champs principaux suivants.
|
Nom |
Type |
Description |
|
row |
Row |
Ligne correspondante. Appelez |
|
score |
Double |
Score de la requête vectorielle. Appelez |
Exemples
Filtrer par conditions non vectorielles et un score minimum
Utilisez filter pour exiger que les voisins les plus proches respectent les conditions de requête non vectorielles, et minScore pour exclure les données dont le score n'est pas supérieur au seuil. L'exemple suivant renvoie uniquement les données où category est book, price est inférieur à 4 et le score vectoriel est supérieur à 0.6.
KnnVectorQuery filteredQuery = new KnnVectorQuery();
filteredQuery.setFieldName("embedding");
filteredQuery.setTopK(10);
filteredQuery.setFloat32QueryVector(
new float[]{1.0f, 0.0f, 0.0f, 0.0f});
filteredQuery.setMinScore(0.6f);
filteredQuery.setFilter(QueryBuilders.bool()
.must(QueryBuilders.term("category", "book"))
.must(QueryBuilders.range("price").lessThan(4)));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(filteredQuery);
searchQuery.setLimit(10);
Ajuster le nombre de candidats
Définissez numCandidates pour élargir l'ensemble de candidats consulté dans chaque partition d'index lors du calcul des voisins les plus proches. L'exemple suivant récupère les trois vecteurs les plus proches parmi quatre candidats.
KnnVectorQuery candidateQuery = new KnnVectorQuery();
candidateQuery.setFieldName("embedding");
candidateQuery.setTopK(3);
candidateQuery.setFloat32QueryVector(
new float[]{1.0f, 0.0f, 0.0f, 0.0f});
candidateQuery.setNumCandidates(4);
SearchQuery candidateSearchQuery = new SearchQuery();
candidateSearchQuery.setQuery(candidateQuery);
candidateSearchQuery.setLimit(3);