Просмотр исходного кода

Support Sparse vector search (#489)

* support insert sample data for sparse vector

Signed-off-by: ryjiang <jiangruiyi@gmail.com>

* search should render sparse vector

Signed-off-by: ryjiang <jiangruiyi@gmail.com>

---------

Signed-off-by: ryjiang <jiangruiyi@gmail.com>
ryjiang 1 год назад
Родитель
Сommit
44334deb3c

+ 11 - 0
client/src/pages/search/SearchParams.tsx

@@ -276,6 +276,17 @@ const SearchParams: FC<SearchParamsProps> = ({
             handleInputChange('search_list', value);
           },
         },
+        drop_ratio_search: {
+          label: 'drop_ratio_search',
+          key: 'drop_ratio_search',
+          value: searchParamsForm['drop_ratio_search'] || '',
+          min: 0,
+          max: 1,
+          isInt: false,
+          handleChange: value => {
+            handleInputChange('drop_ratio_search', value);
+          },
+        },
       };
 
       const param = configParamMap[paramKey];

+ 29 - 7
client/src/pages/search/VectorSearch.tsx

@@ -24,7 +24,12 @@ import {
   generateVector,
   formatNumber,
 } from '@/utils';
-import { LOADING_STATE, DYNAMIC_FIELD, DataTypeEnum } from '@/consts';
+import {
+  LOADING_STATE,
+  DYNAMIC_FIELD,
+  DataTypeEnum,
+  DataTypeStringEnum,
+} from '@/consts';
 import { getLabelDisplayedRows } from './Utils';
 import SearchParams from './SearchParams';
 import { getVectorSearchStyles } from './Styles';
@@ -95,7 +100,7 @@ const VectorSearch = () => {
     const fields = (s.schema && s.schema.fields) || [];
 
     // vector field can't be output fields
-    const invalidTypes = ['BinaryVector', 'FloatVector'];
+    const invalidTypes = ['BinaryVector', 'FloatVector', 'SparseFloatVector'];
     const nonVectorFields = fields.filter(
       field => !invalidTypes.includes(field.data_type)
     );
@@ -180,7 +185,11 @@ const VectorSearch = () => {
    */
   const vectorValueValid = useMemo(() => {
     // if user hasn't input value or not select field, don't trigger validation check
-    if (vectors === '' || selectedFieldDimension === 0) {
+    if (
+      vectors === '' ||
+      selectedFieldDimension === 0 ||
+      fieldType === DataTypeEnum.SparseFloatVector
+    ) {
       return true;
     }
     const dim =
@@ -360,9 +369,19 @@ const VectorSearch = () => {
     setVectors(value);
   };
 
-  const fillWithExampleVector = (selectedFieldDimension: number) => {
-    const v = generateVector(selectedFieldDimension);
-    setVectors(`[${v}]`);
+  const fillWithExampleVector = (
+    selectedFieldDimension: number,
+    field: FieldObject
+  ) => {
+    const isSparse = field.data_type === DataTypeStringEnum.SparseFloatVector;
+    if (isSparse) {
+      setVectors(
+        JSON.stringify({ [Math.floor(Math.random() * 10)]: Math.random() })
+      );
+    } else {
+      const v = generateVector(selectedFieldDimension);
+      setVectors(`[${v}]`);
+    }
   };
 
   return (
@@ -434,7 +453,10 @@ const VectorSearch = () => {
                   fieldType === DataTypeEnum.BinaryVector
                     ? selectedFieldDimension / 8
                     : selectedFieldDimension;
-                fillWithExampleVector(dim);
+                fillWithExampleVector(
+                  dim,
+                  fieldOptions.find(f => f.value === selectedField)!.field
+                );
               }}
             >
               {btnTrans('example')}

+ 1 - 0
server/src/collections/dto.ts

@@ -20,6 +20,7 @@ import {
 enum VectorTypes {
   Binary = DataType.BinaryVector,
   Float = DataType.FloatVector,
+  SparseFloatVector = DataType.SparseFloatVector,
 }
 
 export class CreateCollectionDto {

+ 1 - 1
server/src/utils/Const.ts

@@ -160,7 +160,7 @@ export const DYNAMIC_FIELD = `$meta`;
 export const VectorTypes = [
   'BinaryVector',
   'FloatVector',
-  'SpaseFloatVector',
+  'SparseFloatVector',
   'Float16Vector',
   'BFloat16Vector',
 ];