La búsqueda vectorial con el Tablestore SDK for Java devuelve los datos más cercanos en un índice de búsqueda según la similitud de vectores y admite umbrales de puntuación, recuentos de candidatos y filtros no vectoriales.
Requisitos previos
Instale Tablestore SDK for Java e inicialice el cliente. La búsqueda vectorial requiere la versión 5.17.0 o posterior.
Para configurar
minScoreonumCandidates, utilice la versión 5.17.5 o posterior.
Descripción de la función
La búsqueda vectorial realiza una búsqueda de vecinos más cercanos aproximada (ANN) entre un vector de consulta y los vectores de un campo Vector. Tablestore puntúa los resultados con la métrica de distancia configurada al crear el índice de búsqueda y devuelve los datos más cercanos. A diferencia de las consultas que coinciden con valores de campo, la búsqueda vectorial determina la similitud a partir de la distancia entre vectores.
Llame a search y establezca query como KnnVectorQuery.
SearchResponse search(SearchRequest request)
El siguiente ejemplo recupera los tres vectores del campo embedding más cercanos a [1.0, 0.0, 0.0, 0.0]. Los resultados se ordenan por puntuación en orden descendente.
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());
}
Existen límites para el número y las dimensiones de los campos vectoriales, así como para topK. Para obtener más información, consulte Search index limits.
Parámetros
Solicitud de búsqueda
request es un objeto SearchRequest que contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
tableName (obligatorio) |
String |
El nombre de la tabla. |
|
indexName (obligatorio) |
String |
El nombre del índice de búsqueda. |
|
searchQuery (obligatorio) |
SearchQuery |
La condición de consulta y las configuraciones comunes de consulta. |
|
columnsToGet (opcional) |
SearchRequest.ColumnsToGet |
Las configuraciones de columnas devueltas. Si no se configura este parámetro, solo se devuelven las columnas de clave principal. |
|
timeoutInMillisecond (opcional) |
int |
El tiempo de espera de la consulta a nivel de solicitud, en milisegundos. Valor predeterminado: |
|
routingValues (opcional) |
|
Los valores de clave principal de los campos de enrutamiento personalizados. No configure este parámetro si no hay enrutamiento personalizado. |
Configuración de consulta
request.searchQuery es un objeto SearchQuery que contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
query (obligatorio) |
Query |
La condición de consulta. Establezca este parámetro como |
|
offset (opcional) |
Integer |
La posición desde la cual comienza la consulta. |
|
limit (opcional) |
Integer |
El número máximo de filas que se devolverán. Si este parámetro se establece en |
|
highlight (opcional) |
Highlight |
Las configuraciones de resumen y resaltado. Los campos vectoriales no admiten resumen ni resaltado. |
|
collapse (opcional) |
Collapse |
La configuración de colapso para deduplicar resultados según una columna especificada. |
|
sort (opcional) |
Sort |
El orden de clasificación de los resultados. Utilice |
|
trackTotalCount (opcional) |
int |
El número máximo de filas coincidentes que se contarán. Valor predeterminado: |
|
filter (opcional) |
SearchFilter |
Un filtro aplicado a los resultados de |
|
aggregationList (opcional) |
|
Las configuraciones de agregación. |
|
groupByList (opcional) |
|
Las configuraciones de agrupación. |
|
token (opcional) |
byte[] |
El token de paginación. Establezca este parámetro con el valor de |
Condición de consulta vectorial
request.searchQuery.query es un objeto KnnVectorQuery que contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
fieldName (obligatorio) |
String |
El nombre del campo vectorial. El campo debe ser de tipo Vector y la dimensión del vector de consulta debe coincidir con la dimensión configurada al created the search index. |
|
topK (obligatorio) |
Integer |
El número de vectores más cercanos que se recuperarán. Máximo: |
|
float32QueryVector (obligatorio) |
float[] |
El vector de consulta Float32 utilizado para calcular la similitud. La longitud del arreglo debe coincidir con la dimensión del campo vectorial. |
|
filter (opcional) |
Query |
Condiciones de consulta no vectoriales que también deben cumplir los resultados de la búsqueda vectorial. Puede combinar varios objetos |
|
weight (opcional) |
Float |
El peso de relevancia de la consulta vectorial. El valor debe ser mayor o igual a |
|
minScore (opcional) |
Float |
El umbral de puntuación mínima. El valor debe ser mayor o igual a |
|
numCandidates (opcional) |
Integer |
El número de candidatos consultados en cada partición de índice cuando se calculan los vecinos más cercanos. Valores válidos: |
Columnas devueltas
request.columnsToGet es un objeto SearchRequest.ColumnsToGet que contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
columns (opcional) |
|
Las columnas de atributos que se devolverán. Configure este parámetro solo si tanto |
|
returnAll (opcional) |
boolean |
Especifica si se deben devolver todas las columnas de atributos de la tabla. Valor predeterminado: |
|
returnAllFromIndex (opcional) |
boolean |
Especifica si se deben devolver todas las columnas de atributos indexadas. Valor predeterminado: |
Respuesta
Respuesta de búsqueda
search devuelve un objeto SearchResponse. La siguiente tabla describe los campos principales.
|
Nombre |
Tipo |
Descripción |
|
totalCount |
long |
El número de filas coincidentes. Llame a |
|
rows |
|
Las filas devueltas por esta consulta. Llame a |
|
searchHits |
|
Los aciertos de la consulta. Llame a |
|
nextToken |
byte[] |
El token para la siguiente página. Llame a |
|
isAllSuccess |
boolean |
Indica si se consultaron todas las particiones de índice. Llame a |
Acierto de búsqueda
Cada elemento en response.searchHits[] es un objeto SearchHit que contiene los siguientes campos principales.
|
Nombre |
Tipo |
Descripción |
|
row |
Row |
La fila coincidente. Llame a |
|
score |
Double |
La puntuación de la consulta vectorial. Llame a |
Ejemplos
Filtrar por condiciones no vectoriales y una puntuación mínima
Utilice filter para exigir que los vecinos más cercanos cumplan condiciones de consulta no vectoriales, y use minScore para excluir los datos cuya puntuación no supere el umbral. El siguiente ejemplo devuelve solo los datos donde category es book, price es menor que 4 y la puntuación vectorial es mayor que 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);
Ajustar el recuento de candidatos
Establezca numCandidates para ampliar el conjunto de candidatos consultados en cada partición de índice cuando se calculan los vecinos más cercanos. El siguiente ejemplo recupera los tres vectores más cercanos a partir de cuatro candidatos.
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);