La recherche vectorielle avec le SDK Tablestore pour Java renvoie les données les plus proches dans un index de recherche en fonction de la similarité vectorielle et prend en charge les seuils de score, le nombre de candidats et les filtres non vectoriels.
Prérequis
Initialisez une instance OTSClient. Pour plus d'informations, consultez la rubrique Initialiser un client Tablestore.
Créez un index de recherche et configurez le champ vectoriel sur la table de données. Pour plus d'informations, consultez la rubrique Créer un index de recherche.
Notes d'utilisation
-
Le SDK Tablestore pour Node.js version 5.5.0 ou ultérieure prend en charge la fonctionnalité de requête de vecteurs KNN. Assurez-vous d'avoir installé une version compatible du SDK Tablestore pour Node.js.
RemarquePour obtenir des informations sur l'historique des versions du SDK Tablestore pour Node.js, consultez la rubrique Historique des versions du SDK Tablestore pour Java.
Des limites s'appliquent au nombre de types de champs vectoriels, aux dimensions et à d'autres propriétés. Pour plus d'informations, consultez la rubrique Limites des index de recherche.
L'index de recherche est partitionné côté serveur. Chaque partition renvoie ses propres voisins les plus proches (TopK), puis les résultats sont agrégés au niveau du nœud client. Par conséquent, si un jeton est utilisé pour paginer l'ensemble des données, le nombre total de lignes renvoyées dépend du nombre de partitions côté serveur.
Paramètres
Exemple
L'exemple de code suivant montre comment interroger les dix voisins les plus proches d'un vecteur spécifique dans une table de données. Dans cet exemple, la valeur de la colonne col_keyword des vecteurs voisins doit être égale à « 0 » et la valeur de la colonne col_long des vecteurs voisins doit être comprise entre 0 et 50.
const tableName = "<TABLE_ANME>"
const indexName = "<SEARCH_INDEX_NAME>"
async function knnVectorQuery() {
return new Promise(function (resolve, reject) {
let params = {
tableName: tableName,
indexName: indexName,
searchQuery: {
offset: 0,
limit: 10,
query: {
queryType: TableStore.QueryType.KNN_VECTOR_QUERY,
query: {
fieldName: "col_vector",
topK: TableStore.Long.fromNumber(10),
float32QueryVector: [1.0, 1.1, 1.2, -1.3],
filter: {
queryType: TableStore.QueryType.BOOL_QUERY,
query: {
mustQueries: [
{
queryType: TableStore.QueryType.RANGE_QUERY,
query: {
fieldName: "col_long",
rangeFrom: TableStore.Long.fromNumber(0),
includeLower: true,
rangeTo: TableStore.Long.fromNumber(50),
includeUpper: true,
}
},
{
queryType: TableStore.QueryType.TERM_QUERY,
query: {
fieldName: "col_keyword",
term: "0",
}
},
],
}
},
},
},
sort: {
sorters: [
{
scoreSort: {
order: TableStore.SortOrder.SORT_ORDER_DESC // Sort the query results based on the scores in descending order.
}
}
],
},
getTotalCount: false,
},
columnToGet: {
returnType: TableStore.ColumnReturnType.RETURN_SPECIFIED,
returnNames: ["col_long", "col_keyword"]
},
timeoutMs: 10000,
}
client.search(params, function (err, data) {
if (err) {
console.log('search error:', err.toString());
reject(err);
} else {
console.log('RequestId:', data.RequestId);
for (let i = 0; i < data.searchHits.length; i++) {
let hit = data.searchHits[i]
console.log('Score:', hit.score, 'Row:', hit.row);
}
resolve(data)
}
});
})
}
knnVectorQuery();
FAQ
Optimiser les performances de récupération vectorielle dans Tablestore
Références
-
Les index de recherche prennent en charge les types de requêtes suivants : requête term, requête terms, requête match all, requête match, requête match phrase, requête prefix, requête range, requête wildcard, requête Boolean, requête geo, requête nested, requête vector et requête exists. Sélectionnez un type de requête pour interroger les données en fonction de vos besoins métier.
Pour trier ou paginer les lignes qui répondent aux conditions de la requête, utilisez la fonctionnalité de tri et de pagination. Pour plus d'informations, consultez la rubrique Tri et pagination.
Pour regrouper l'ensemble des résultats en fonction d'une colonne spécifique, utilisez la fonctionnalité de regroupement (distinct). Ainsi, les données du type spécifié n'apparaissent qu'une seule fois dans les résultats de la requête. Pour plus d'informations, consultez la rubrique Regroupement (distinct).
Pour analyser les données d'une table de données, par exemple pour obtenir les valeurs extrêmes, la somme et le nombre total de lignes, effectuez des opérations d'agrégation ou exécutez des instructions SQL. Pour plus d'informations, consultez les rubriques Agrégation et Requête SQL.
Pour obtenir rapidement toutes les lignes qui répondent aux conditions de la requête sans avoir besoin de les trier, appelez les opérations ParallelScan et ComputeSplits afin d'utiliser la fonctionnalité d'analyse parallèle. Pour plus d'informations, consultez la rubrique Analyse parallèle.