From b39e697ab30342c51368edaf43d5a39c4de9d978 Mon Sep 17 00:00:00 2001 From: shanghaikid Date: Thu, 16 Mar 2023 16:56:42 +0800 Subject: [PATCH 1/7] support rename collection --- README.md | 2 +- client/src/components/icons/Icons.tsx | 16 +- client/src/components/icons/Types.ts | 4 +- client/src/http/Collection.ts | 10 + client/src/i18n/en/button.ts | 1 + client/src/i18n/en/collection.ts | 8 + client/src/i18n/en/dialog.ts | 1 + client/src/i18n/en/success.ts | 1 + client/src/pages/collections/Collections.tsx | 41 +++- client/src/pages/collections/Types.ts | 10 +- .../pages/dialogs/RenameCollectionDialog.tsx | 97 ++++++++ client/src/pages/dialogs/Types.ts | 16 +- server/package.json | 2 +- .../src/collections/collections.controller.ts | 34 +-- server/src/collections/collections.service.ts | 7 + server/src/collections/dto.ts | 8 +- server/src/utils/Error.ts | 2 +- server/src/utils/Helper.ts | 6 +- server/yarn.lock | 214 +----------------- 19 files changed, 241 insertions(+), 239 deletions(-) create mode 100644 client/src/pages/dialogs/RenameCollectionDialog.tsx diff --git a/README.md b/README.md index d3b0f67c..19f6905f 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Once you start the container, open the browser, type `http://{ attu ip }:8000`, #### Docker CLI parameters -| Parameter | Example | required | description | +| Parameter | Example | description | | :--------- | :---------------- | :------: | --------------------------- | | MILVUS_URL | 192.168.0.1:19530 | false | Optional, Milvus server URL | diff --git a/client/src/components/icons/Icons.tsx b/client/src/components/icons/Icons.tsx index 6d8f1b3c..037833b2 100644 --- a/client/src/components/icons/Icons.tsx +++ b/client/src/components/icons/Icons.tsx @@ -8,6 +8,7 @@ import FileCopyIcon from '@material-ui/icons/FileCopy'; import Visibility from '@material-ui/icons/Visibility'; import VisibilityOff from '@material-ui/icons/VisibilityOff'; import ClearIcon from '@material-ui/icons/Clear'; +import EditIcon from '@material-ui/icons/Edit'; import ReorderIcon from '@material-ui/icons/Reorder'; import AppsIcon from '@material-ui/icons/Apps'; import MoreVertIcon from '@material-ui/icons/MoreVert'; @@ -45,7 +46,7 @@ import { ReactComponent as SystemIcon } from '../../assets/icons/system.svg'; const icons: { [x in IconsType]: (props?: any) => React.ReactElement } = { search: (props = {}) => , add: (props = {}) => , - addOutline: (props = {}) => , + addOutline: (props = {}) => , delete: (props = {}) => , list: (props = {}) => , copy: (props = {}) => , @@ -68,6 +69,7 @@ const icons: { [x in IconsType]: (props?: any) => React.ReactElement } = { alias: (props = {}) => , datePicker: (props = {}) => , download: (props = {}) => , + edit: (props = {}) => , zilliz: (props = {}) => ( @@ -108,7 +110,12 @@ const icons: { [x in IconsType]: (props?: any) => React.ReactElement } = { ), upload: (props = {}) => ( - + ), vectorSearch: (props = {}) => ( @@ -121,6 +128,11 @@ const icons: { [x in IconsType]: (props?: any) => React.ReactElement } = { ), + uploadFile: (props = {}) => ( + + + + ), }; export default icons; diff --git a/client/src/components/icons/Types.ts b/client/src/components/icons/Types.ts index af9d0ab5..f51d662b 100644 --- a/client/src/components/icons/Types.ts +++ b/client/src/components/icons/Types.ts @@ -38,4 +38,6 @@ export type IconsType = | 'alias' | 'datePicker' | 'download' - | 'source'; + | 'source' + | 'edit' + | 'uploadFile'; diff --git a/client/src/http/Collection.ts b/client/src/http/Collection.ts index 3166003d..648695ee 100644 --- a/client/src/http/Collection.ts +++ b/client/src/http/Collection.ts @@ -83,6 +83,16 @@ export class CollectionHttp extends BaseModel implements CollectionView { }); } + static renameCollection( + collectionName: string, + params: { new_collection_name: string } + ) { + return super.create({ + path: `${this.COLLECTIONS_URL}/${collectionName}`, + data: params, + }); + } + static getStatistics() { return super.search({ path: this.COLLECTIONS_STATISTICS_URL, params: {} }); } diff --git a/client/src/i18n/en/button.ts b/client/src/i18n/en/button.ts index 4a2010ae..0e1de520 100644 --- a/client/src/i18n/en/button.ts +++ b/client/src/i18n/en/button.ts @@ -23,6 +23,7 @@ const btnTrans = { loading: 'Loading...', importing: 'Importing...', example: 'Example', + rename: 'Rename', }; export default btnTrans; diff --git a/client/src/i18n/en/collection.ts b/client/src/i18n/en/collection.ts index af481f62..599e5a5c 100644 --- a/client/src/i18n/en/collection.ts +++ b/client/src/i18n/en/collection.ts @@ -7,6 +7,9 @@ const collectionTrans = { create: 'Create Collection', delete: 'delete', deleteTooltip: 'Please select at least one item to delete.', + rename: 'rename', + renameTooltip: 'Please select one item to rename.', + newColName: 'New Collection Name', alias: 'Alias', aliasTooltip: 'Please select one collection to create alias', download: 'Download', @@ -85,6 +88,11 @@ const collectionTrans = { // alias dialog aliasCreatePlaceholder: 'Alias name', + + // rename dialog + newColNamePlaceholder: 'New Collection Name', + newNameInfo: + 'Only numbers, letters, and underscores are allowed.', }; export default collectionTrans; diff --git a/client/src/i18n/en/dialog.ts b/client/src/i18n/en/dialog.ts index b4a812bc..91d5971c 100644 --- a/client/src/i18n/en/dialog.ts +++ b/client/src/i18n/en/dialog.ts @@ -2,6 +2,7 @@ const dialogTrans = { deleteTipAction: 'Type', deleteTipPurpose: 'to confirm.', deleteTitle: `Drop {{type}}`, + renameTitle: `Rename {{type}}`, releaseTitle: `Release {{type}}`, createAlias: `Create alias for {{type}}`, loadTitle: `Load {{type}}`, diff --git a/client/src/i18n/en/success.ts b/client/src/i18n/en/success.ts index a4a48d8d..6bd272ba 100644 --- a/client/src/i18n/en/success.ts +++ b/client/src/i18n/en/success.ts @@ -5,6 +5,7 @@ const successTrans = { delete: `{{name}} successfully dropped.`, release: `{{name}} has been released.`, update: `{{name}} has been updated.`, + rename: `{{name}} has been updated.`, }; export default successTrans; diff --git a/client/src/pages/collections/Collections.tsx b/client/src/pages/collections/Collections.tsx index e749bf99..84b85163 100644 --- a/client/src/pages/collections/Collections.tsx +++ b/client/src/pages/collections/Collections.tsx @@ -21,6 +21,7 @@ import { CollectionHttp } from '../../http/Collection'; import LoadCollectionDialog from '../dialogs/LoadCollectionDialog'; import ReleaseCollectionDialog from '../dialogs/ReleaseCollectionDialog'; import DropCollectionDialog from '../dialogs/DropCollectionDialog'; +import RenameCollectionDialog from '../dialogs/RenameCollectionDialog'; import Highlighter from 'react-highlight-words'; import InsertDialog from '../dialogs/insert/Dialog'; import ImportSampleDialog from '../dialogs/ImportSampleDialog'; @@ -205,6 +206,14 @@ const Collections = () => { setSelectedCollections([]); }; + const onRename = () => { + openSnackBar( + successTrans('rename', { name: collectionTrans('collection') }) + ); + fetchData(); + setSelectedCollections([]); + }; + const handleSearch = (value: string) => { setSearch(value); }; @@ -224,6 +233,8 @@ const Collections = () => { icon: 'add', }, { + icon: 'uploadFile', + type: 'iconBtn', label: btnTrans('insert'), onClick: () => { setDialog({ @@ -253,15 +264,28 @@ const Collections = () => { */ disabled: () => collectionList.length === 0 || selectedCollections.length > 1, - btnVariant: 'outlined', }, { + icon: 'edit', type: 'iconBtn', onClick: () => { - fetchData(); + setDialog({ + open: true, + type: 'custom', + params: { + component: ( + + ), + }, + }); }, - label: collectionTrans('delete'), - icon: 'refresh', + label: collectionTrans('rename'), + // tooltip: collectionTrans('deleteTooltip'), + disabledTooltip: collectionTrans('renameTooltip'), + disabled: data => data.length !== 1, }, { type: 'iconBtn', @@ -286,6 +310,15 @@ const Collections = () => { disabled: data => data.length === 0, }, + { + type: 'iconBtn', + onClick: () => { + fetchData(); + }, + label: collectionTrans('delete'), + icon: 'refresh', + }, + { label: 'Search', icon: 'search', diff --git a/client/src/pages/collections/Types.ts b/client/src/pages/collections/Types.ts index 6654020d..86b34883 100644 --- a/client/src/pages/collections/Types.ts +++ b/client/src/pages/collections/Types.ts @@ -117,10 +117,6 @@ export interface CreateFieldsProps { autoID: boolean; setAutoID: (value: boolean) => void; } -export interface CreateAliasProps { - collectionName: string; - cb?: () => void; -} export interface InsertDataParam { partition_names: string[]; @@ -150,3 +146,9 @@ export enum TAB_EMUM { 'data-preview', 'data-query', } + +export interface LoadSampleParam { + collection_name: string; + // e.g. [{vector: [1,2,3], age: 10}] + size: string; +} diff --git a/client/src/pages/dialogs/RenameCollectionDialog.tsx b/client/src/pages/dialogs/RenameCollectionDialog.tsx new file mode 100644 index 00000000..4f7e9ffc --- /dev/null +++ b/client/src/pages/dialogs/RenameCollectionDialog.tsx @@ -0,0 +1,97 @@ +import { FC, useContext, useMemo, useState } from 'react'; +import { Typography, makeStyles, Theme } from '@material-ui/core'; +import { useTranslation } from 'react-i18next'; +import { rootContext } from '../../context/Root'; +import DialogTemplate from '../../components/customDialog/DialogTemplate'; +import CustomInput from '../../components/customInput/CustomInput'; +import { formatForm } from '../../utils/Form'; +import { useFormValidation } from '../../hooks/Form'; +import { ITextfieldConfig } from '../../components/customInput/Types'; +import { CollectionHttp } from '../../http/Collection'; +import { RenameCollectionProps } from './Types'; + +const useStyles = makeStyles((theme: Theme) => ({ + desc: { + margin: '8px 0 16px 0', + }, +})); + +const RenameCollectionDialog: FC = props => { + const { collectionName, cb } = props; + const [form, setForm] = useState({ + new_collection_name: '', + }); + + const classes = useStyles(); + + const checkedForm = useMemo(() => { + const { new_collection_name } = form; + return formatForm({ new_collection_name }); + }, [form]); + + const { validation, checkIsValid, disabled } = useFormValidation(checkedForm); + + const { handleCloseDialog } = useContext(rootContext); + const { t: dialogTrans } = useTranslation('dialog'); + const { t: warningTrans } = useTranslation('warning'); + const { t: collectionTrans } = useTranslation('collection'); + const { t: btnTrans } = useTranslation('btn'); + + const handleInputChange = (value: string) => { + setForm({ new_collection_name: value }); + }; + + const handleConfirm = async () => { + await CollectionHttp.renameCollection(collectionName, form); + handleCloseDialog(); + cb && cb(); + }; + + const renameInputCfg: ITextfieldConfig = { + label: collectionTrans('newColName'), + key: 'new_collection_name', + onChange: handleInputChange, + variant: 'filled', + placeholder: collectionTrans('newColNamePlaceholder'), + fullWidth: true, + validations: [ + { + rule: 'require', + errorText: warningTrans('required', { + name: collectionTrans('name'), + }), + }, + { + rule: 'collectionName', + errorText: collectionTrans('nameContentWarning'), + }, + ], + defaultValue: form.new_collection_name, + }; + return ( + + + {collectionTrans('newNameInfo')} + + + + } + confirmLabel={btnTrans('rename')} + handleConfirm={handleConfirm} + confirmDisabled={disabled} + /> + ); +}; + +export default RenameCollectionDialog; diff --git a/client/src/pages/dialogs/Types.ts b/client/src/pages/dialogs/Types.ts index 1768484a..843cf9e1 100644 --- a/client/src/pages/dialogs/Types.ts +++ b/client/src/pages/dialogs/Types.ts @@ -1,12 +1,6 @@ import { CollectionData } from '../collections/Types'; import { PartitionData } from '../partitions/Types'; -export interface LoadSampleParam { - collection_name: string; - // e.g. [{vector: [1,2,3], age: 10}] - size: string; -} - export interface DropCollectionProps { collections: CollectionData[]; onDelete: () => void; @@ -22,3 +16,13 @@ export interface PartitionCreateProps { onCreate: () => void; collectionName: string; } + +export interface CreateAliasProps { + collectionName: string; + cb?: () => void; +} + +export interface RenameCollectionProps { + collectionName: string; + cb?: () => void; +} \ No newline at end of file diff --git a/server/package.json b/server/package.json index d99654f7..19919106 100644 --- a/server/package.json +++ b/server/package.json @@ -12,7 +12,7 @@ "url": "https://github.com/zilliztech/attu" }, "dependencies": { - "@zilliz/milvus2-sdk-node": "^2.2.1", + "@zilliz/milvus2-sdk-node": "^2.2.4", "axios": "^1.3.2", "chalk": "^4.1.2", "class-sanitizer": "^1.0.1", diff --git a/server/src/collections/collections.controller.ts b/server/src/collections/collections.controller.ts index c7879e74..9b5aba3a 100644 --- a/server/src/collections/collections.controller.ts +++ b/server/src/collections/collections.controller.ts @@ -9,6 +9,7 @@ import { ImportSampleDto, VectorSearchDto, QueryDto, + RenameCollectionDto, } from './dto'; import { LoadCollectionReq } from '@zilliz/milvus2-sdk-node/dist/milvus/types'; @@ -28,61 +29,52 @@ export class CollectionController { generateRoutes() { this.router.get('/', this.showCollections.bind(this)); - this.router.post( '/', dtoValidationMiddleware(CreateCollectionDto), this.createCollection.bind(this) ); - this.router.get('/statistics', this.getStatistics.bind(this)); - this.router.get( '/:name/statistics', this.getCollectionStatistics.bind(this) ); - this.router.get( '/indexes/status', this.getCollectionsIndexStatus.bind(this) ); - this.router.delete('/:name', this.dropCollection.bind(this)); + this.router.post( + '/:name', + dtoValidationMiddleware(RenameCollectionDto), + this.renameCollection.bind(this) + ); this.router.delete('/:name/alias/:alias', this.dropAlias.bind(this)); - this.router.get('/:name', this.describeCollection.bind(this)); - this.router.put('/:name/load', this.loadCollection.bind(this)); - this.router.put('/:name/release', this.releaseCollection.bind(this)); - this.router.post( '/:name/insert', dtoValidationMiddleware(InsertDataDto), this.insert.bind(this) ); - this.router.post( '/:name/importSample', dtoValidationMiddleware(ImportSampleDto), this.importSample.bind(this) ); - // we need use req.body, so we can't use delete here this.router.put('/:name/entities', this.deleteEntities.bind(this)); - this.router.post( '/:name/search', dtoValidationMiddleware(VectorSearchDto), this.vectorSearch.bind(this) ); - this.router.post( '/:name/query', dtoValidationMiddleware(QueryDto), this.query.bind(this) ); - this.router.post( '/:name/alias', dtoValidationMiddleware(CreateAliasDto), @@ -126,6 +118,20 @@ export class CollectionController { } } + async renameCollection(req: Request, res: Response, next: NextFunction) { + const name = req.params?.name; + const data = req.body; + try { + const result = await this.collectionsService.renameCollection({ + collection_name: name, + ...data, + }); + res.send(result); + } catch (error) { + next(error); + } + } + async dropCollection(req: Request, res: Response, next: NextFunction) { const name = req.params?.name; try { diff --git a/server/src/collections/collections.service.ts b/server/src/collections/collections.service.ts index 5239a001..1477acd2 100644 --- a/server/src/collections/collections.service.ts +++ b/server/src/collections/collections.service.ts @@ -9,6 +9,7 @@ import { LoadCollectionReq, ReleaseLoadCollectionReq, SearchReq, + RenameCollectionReq, } from '@zilliz/milvus2-sdk-node/dist/milvus/types'; import { throwErrorFromSDK } from '../utils/Error'; import { findKeyValue, genRows } from '../utils/Helper'; @@ -56,6 +57,12 @@ export class CollectionsService { return res; } + async renameCollection(data: RenameCollectionReq) { + const res = await this.collectionManager.renameCollection(data); + throwErrorFromSDK(res); + return res; + } + async dropCollection(data: DropCollectionReq) { const res = await this.collectionManager.dropCollection(data); throwErrorFromSDK(res); diff --git a/server/src/collections/dto.ts b/server/src/collections/dto.ts index 9f0f2407..af95ddc4 100644 --- a/server/src/collections/dto.ts +++ b/server/src/collections/dto.ts @@ -13,7 +13,7 @@ import { FieldType, ShowCollectionsType, } from '@zilliz/milvus2-sdk-node/dist/milvus/types/Collection'; -import { DataType } from '@zilliz/milvus2-sdk-node/dist/milvus/types/Common'; +import { DataType } from '@zilliz/milvus2-sdk-node/dist/milvus/const/Milvus'; import { SearchParam } from '@zilliz/milvus2-sdk-node/dist/milvus/types'; enum VectorTypes { @@ -100,3 +100,9 @@ export class QueryDto { @IsOptional() readonly output_fields: string[]; } + +export class RenameCollectionDto { + @IsString() + @IsNotEmpty({ message: 'new_collection_name is empty.' }) + new_collection_name: string; +} diff --git a/server/src/utils/Error.ts b/server/src/utils/Error.ts index 49adeab6..3e4871d4 100644 --- a/server/src/utils/Error.ts +++ b/server/src/utils/Error.ts @@ -1,7 +1,7 @@ import { ErrorCode, ResStatus, -} from '@zilliz/milvus2-sdk-node/dist/milvus/types/Response'; +} from '@zilliz/milvus2-sdk-node/dist/milvus/types'; export const throwErrorFromSDK = (res: ResStatus) => { if (res.error_code !== ErrorCode.SUCCESS) { diff --git a/server/src/utils/Helper.ts b/server/src/utils/Helper.ts index eeb76e9f..85e58146 100644 --- a/server/src/utils/Helper.ts +++ b/server/src/utils/Helper.ts @@ -1,5 +1,7 @@ -import { KeyValuePair } from '@zilliz/milvus2-sdk-node/dist/milvus/types/Common'; -import { FieldSchema } from '@zilliz/milvus2-sdk-node/dist/milvus/types/Response'; +import { + KeyValuePair, + FieldSchema, +} from '@zilliz/milvus2-sdk-node/dist/milvus/types'; export const findKeyValue = (obj: KeyValuePair[], key: string) => obj.find(v => v.key === key)?.value; diff --git a/server/yarn.lock b/server/yarn.lock index 1b22f68f..cc9a1241 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -641,61 +641,6 @@ lodash "^4.17.15" tmp-promise "^3.0.2" -"@microsoft/api-documenter@^7.13.39": - version "7.13.65" - resolved "https://registry.yarnpkg.com/@microsoft/api-documenter/-/api-documenter-7.13.65.tgz#c9c82369046e882d26f557ab187428f254123b62" - integrity sha512-cajrUQaNTjzRXMzftUhTku5J4BHSqrCiPXv3tCzdWnii9FxZpqvAYZelfW0/Tz9gjM9kYEMp9Msetf41AR1u7A== - dependencies: - "@microsoft/api-extractor-model" "7.13.14" - "@microsoft/tsdoc" "0.13.2" - "@rushstack/node-core-library" "3.43.0" - "@rushstack/ts-command-line" "4.10.3" - colors "~1.2.1" - js-yaml "~3.13.1" - resolve "~1.17.0" - -"@microsoft/api-extractor-model@7.13.14": - version "7.13.14" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.13.14.tgz#071bf881942814c7786a20c6805bc5cde4019bc5" - integrity sha512-mKc917+QhOuOZebSnE77i8Tavj/G5ydIFoJqDIY9LpmAfJjsVHgL2pc7vkvW58QTxH2wadIDK1tLzcteOMEt4w== - dependencies: - "@microsoft/tsdoc" "0.13.2" - "@microsoft/tsdoc-config" "~0.15.2" - "@rushstack/node-core-library" "3.43.0" - -"@microsoft/api-extractor@^7.18.5": - version "7.18.17" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.18.17.tgz#3139f803fcaef919c7ff68e02bd6759bc637a64b" - integrity sha512-gZuJ//FAyfrOqWssY0cyU2bEo8FOIaIYVs+pU5IDyfImkye6YkT2Qnm5PAFhyYSkfUjV5SjvyuP4+VsDfS3jww== - dependencies: - "@microsoft/api-extractor-model" "7.13.14" - "@microsoft/tsdoc" "0.13.2" - "@microsoft/tsdoc-config" "~0.15.2" - "@rushstack/node-core-library" "3.43.0" - "@rushstack/rig-package" "0.3.4" - "@rushstack/ts-command-line" "4.10.3" - colors "~1.2.1" - lodash "~4.17.15" - resolve "~1.17.0" - semver "~7.3.0" - source-map "~0.6.1" - typescript "~4.4.2" - -"@microsoft/tsdoc-config@~0.15.2": - version "0.15.2" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz#eb353c93f3b62ab74bdc9ab6f4a82bcf80140f14" - integrity sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA== - dependencies: - "@microsoft/tsdoc" "0.13.2" - ajv "~6.12.6" - jju "~1.4.0" - resolve "~1.19.0" - -"@microsoft/tsdoc@0.13.2": - version "0.13.2" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz#3b0efb6d3903bd49edb073696f60e90df08efb26" - integrity sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg== - "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -749,39 +694,6 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= -"@rushstack/node-core-library@3.43.0": - version "3.43.0" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.43.0.tgz#aace43bf49bc907445fa306f8c2e6010a8353cda" - integrity sha512-MFLW+6X83k6o8m8KnWkDhL/8NCJYHbFnnDokPSX1UHC3JwiEvVhHmEnxZv2YEzwnXeFYoKViub2G2t2liHbHLA== - dependencies: - "@types/node" "12.20.24" - colors "~1.2.1" - fs-extra "~7.0.1" - import-lazy "~4.0.0" - jju "~1.4.0" - resolve "~1.17.0" - semver "~7.3.0" - timsort "~0.3.0" - z-schema "~3.18.3" - -"@rushstack/rig-package@0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.3.4.tgz#13987cea8eef2f350e2e7538e028fa839f8c4f3c" - integrity sha512-NsCzPxPQ8cu7lnqa/4xBQXuCJwaBrb5vEbOC8Q/bMQK7GDOxeVUN3/f+NCYjgQSl39toAm8jQJ7TJe+RYYX3yQ== - dependencies: - resolve "~1.17.0" - strip-json-comments "~3.1.1" - -"@rushstack/ts-command-line@4.10.3": - version "4.10.3" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.10.3.tgz#2b8610473f2aa9e22450273f662abb02a3979a11" - integrity sha512-DdDfwr8CO6CP/kBZlQrrwKyA6UxOteujaIBrmoHa+J+dyLZC19YA/LK0fAHjr2qHLAJHHXVpZwPH8BpqN84oVg== - dependencies: - "@types/argparse" "1.0.38" - argparse "~1.0.9" - colors "~1.2.1" - string-argv "~0.3.1" - "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -838,11 +750,6 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== -"@types/argparse@1.0.38": - version "1.0.38" - resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" - integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== - "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": version "7.1.16" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" @@ -1045,11 +952,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== -"@types/node@12.20.24": - version "12.20.24" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.24.tgz#c37ac69cb2948afb4cef95f424fa0037971a9a5c" - integrity sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ== - "@types/node@^16.11.26": version "16.18.3" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.3.tgz#d7f7ba828ad9e540270f01ce00d391c54e6e0abc" @@ -1162,17 +1064,13 @@ dependencies: "@types/node" "*" -"@zilliz/milvus2-sdk-node@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@zilliz/milvus2-sdk-node/-/milvus2-sdk-node-2.2.1.tgz#93b024f9d22af340086d5545488d3d000d798a29" - integrity sha512-dfUnnFf2CKDos2lewibcCf+GR2LO3MTb2eGWCbUvobIdjMVdFm9z9M6ih7NIpGVbPJoKGUwEHT3UlycWOpkuXw== +"@zilliz/milvus2-sdk-node@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@zilliz/milvus2-sdk-node/-/milvus2-sdk-node-2.2.4.tgz#617cc97a405c0a56f7ab33ee379022e77b46c291" + integrity sha512-1DRZhuWDpjzKo6zYVr8wK4cfhIFMrnDwc+D6sfQR4KxXmYZikTTFxLJBtvzyFw1TgVmXRZ6UUQ3JgerzwOcxQg== dependencies: "@grpc/grpc-js" "^1.2.12" "@grpc/proto-loader" "^0.7.3" - "@microsoft/api-documenter" "^7.13.39" - "@microsoft/api-extractor" "^7.18.5" - json-schema "^0.4.0" - node-forge "^1.0.0" protobufjs "^7.1.2" abab@^2.0.3, abab@^2.0.5: @@ -1233,7 +1131,7 @@ ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.10.0, ajv@^6.12.0, ajv@~6.12.6: +ajv@^6.10.0, ajv@^6.12.0: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1331,7 +1229,7 @@ arg@^4.1.0: resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== -argparse@^1.0.7, argparse@~1.0.9: +argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== @@ -1872,11 +1770,6 @@ colors@1.0.3: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@~1.2.1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.5.tgz#89c7ad9a374bc030df8013241f68136ed8835afc" - integrity sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg== - combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -2664,15 +2557,6 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@~7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -2994,11 +2878,6 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= -import-lazy@~4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" - integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== - import-local@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0" @@ -3066,7 +2945,7 @@ is-ci@^3.0.0: dependencies: ci-info "^3.2.0" -is-core-module@^2.1.0, is-core-module@^2.2.0: +is-core-module@^2.2.0: version "2.8.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== @@ -3632,11 +3511,6 @@ jest@^27.3.1: import-local "^3.0.2" jest-cli "^27.3.1" -jju@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" - integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= - js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3657,14 +3531,6 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -js-yaml@~3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - jsdom@^16.6.0: version "16.7.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" @@ -3713,11 +3579,6 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -3800,12 +3661,12 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= -lodash.get@^4.0.0, lodash.get@^4.4.2: +lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= -lodash.isequal@^4.0.0, lodash.isequal@^4.5.0: +lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= @@ -3820,7 +3681,7 @@ lodash.mergewith@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== -lodash@^4.17.10, lodash@^4.17.15, lodash@^4.7.0, lodash@~4.17.15: +lodash@^4.17.10, lodash@^4.17.15, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -4049,11 +3910,6 @@ node-cron@^3.0.0: dependencies: moment-timezone "^0.5.31" -node-forge@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.2.1.tgz#82794919071ef2eb5c509293325cec8afd0fd53c" - integrity sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w== - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -4522,21 +4378,6 @@ resolve@^1.20.0, resolve@^1.3.2: is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@~1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -resolve@~1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== - dependencies: - is-core-module "^2.1.0" - path-parse "^1.0.6" - responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -4609,7 +4450,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@~7.3.0: +semver@7.x, semver@^7.3.2, semver@^7.3.4: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -4825,11 +4666,6 @@ stat-mode@^1.0.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -string-argv@~0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" - integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== - string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -4876,11 +4712,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -strip-json-comments@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - sumchecker@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" @@ -5020,11 +4851,6 @@ throat@^6.0.1: resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== -timsort@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - tmp-promise@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" @@ -5211,7 +5037,7 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.4.4, typescript@~4.4.2: +typescript@^4.4.4: version "4.4.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== @@ -5306,11 +5132,6 @@ validator@^13.1.1, validator@^13.5.2, validator@^13.6.0: resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== -validator@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-8.2.0.tgz#3c1237290e37092355344fef78c231249dab77b9" - integrity sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA== - vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -5529,14 +5350,3 @@ z-schema@^4.2.3: validator "^13.6.0" optionalDependencies: commander "^2.7.1" - -z-schema@~3.18.3: - version "3.18.4" - resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-3.18.4.tgz#ea8132b279533ee60be2485a02f7e3e42541a9a2" - integrity sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw== - dependencies: - lodash.get "^4.0.0" - lodash.isequal "^4.0.0" - validator "^8.0.0" - optionalDependencies: - commander "^2.7.1" From 0e7e5650537f86419b7b6ec5713d5d515c75363a Mon Sep 17 00:00:00 2001 From: shanghaikid Date: Fri, 17 Mar 2023 14:21:47 +0800 Subject: [PATCH 2/7] update readme --- README.md | 136 +++++++++++++++++++++++++----------------------------- 1 file changed, 62 insertions(+), 74 deletions(-) diff --git a/README.md b/README.md index 19f6905f..ef231908 100644 --- a/README.md +++ b/README.md @@ -10,62 +10,37 @@ Attu is an all-in-one milvus administration tool. With Attu, you can dramaticall ## Features -- Basic dashboard - - View basic collection statistics - - Quick search from loaded collection - - Quick release loaded collection -- Manage collections/partitions - - Create/Drop collection/partion - - Create/drop alias - - View collection schema - - Create/drop index with parameters - - Load/release collections for search -- Data Management - - Insert entities - - Data preview - - Data query -- Vector search/query with advanced filter -- System view - - View milvus nodes system info - - View milvus nodes configuration -- Manage Milvus user -- More are comming... - -## Quick start - -> If you prefer desktop application, you can download the [desktop version of Attu](https://github.com/zilliztech/attu/releases/). - -## Run attu from docker - -> Ensure you have Milvus installed on [your server](https://milvus.io/docs/install_standalone-docker.md) or [cluster](https://milvus.io/docs/install_cluster-docker.md), and attu only supports Milvus 2.x. - -> _ Before attu v2.1.0 , [check here](https://github.com/zilliztech/attu/tree/v2.0.5) _\*\* - -### ✈️ Start a attu container +- Basic Dashboard: Get an overview of your collection statistics, perform quick searches, and release collections quickly. +- Collection Management: Create, drop, and manage collections using our intuitive interface. You can also create aliases, view collection schemas, and configure indexes with custom parameters. +- Data Management: Insert entities, preview your data, and run queries to analyze your results. +- Vector Search/Query: Use our advanced filtering system to search and query vectors with precision. +- System View: View system information and Milvus node configurations easily. +- Milvus User Management: Manage users and their permissions with ease. +- More Features Coming Soon: Stay tuned for additional features that will make Milvus even more powerful and user-friendly. -```code -docker run -p 8000:3000 -e MILVUS_URL={milvus server ip}:19530 zilliz/attu:latest -``` +## Quick start guide for Attu -> πŸ‘€ Please make sure the attu server(container) can access the milvus ip address. +If you prefer to use a desktop application, you can download the [desktop version of Attu](https://github.com/zilliztech/attu/releases/). -Once you start the container, open the browser, type `http://{ attu ip }:8000`, you can view the attu GUI. +### Running Attu from Docker -#### Docker CLI parameters +Before you begin, make sure that you have Milvus installed on either [your server](https://milvus.io/docs/install_cluster-docker.md) or [Zilliz Cloud](https://zilliz.com/cloud). Note that Attu only supports Milvus 2.x and some of the features are not supported yet for Zilliz Cloud. -| Parameter | Example | description | -| :--------- | :---------------- | :------: | --------------------------- | -| MILVUS_URL | 192.168.0.1:19530 | false | Optional, Milvus server URL | +Here are the steps to start a container for running Attu: -Tip: **127.0.0.1 or localhost will not work when runs on docker** +```code +docker run -p 8000:3000 -e MILVUS_URL={milvus server IP}:19530 zilliz/attu:latest +``` -## Try the dev build +Make sure that the Attu container can access the Milvus IP address. After starting the container, open your web browser and enter `http://{ Attu IP }:8000` to view the Attu GUI. -> We plan to release attu once a feature is done. Also, if you want to try the nightly build, please pull the docker image with the `dev` tag. +#### Parameters for Docker CLI -```code -docker run -p 8000:3000 -e MILVUS_URL={ your machine IP }:19530 zilliz/attu:dev -``` +| Parameter | Example | Required | Description | +| :--------- | :---------------- | :------: | --------------------------- | +| MILVUS_URL | 192.168.0.1:19530 | false | Optional, Milvus server URL | + +Note that "127.0.0.1" or "localhost" will not work when running Attu on Docker. ## Screenshots @@ -78,47 +53,60 @@ docker run -p 8000:3000 -e MILVUS_URL={ your machine IP }:19530 zilliz/attu:dev ## ✨ Contributing Code -You might want to build Attu locally to contribute some code, test out the latest features, or try -out an open PR: +Thank you for your interest in contributing to Attu! Here's how you can build Attu locally to contribute code, test out the latest features, or try out an open PR: + +### Build the Server + +1. Fork and clone the Attu repository. +2. Navigate to the server directory by running `cd server` in the terminal. +3. Install dependencies by running `yarn install`. +4. To start the server in development mode, run `yarn start`. +5. Create a new branch for your PR by running `git checkout -b my-branch`. + +### Build the Client + +1. Fork and clone the Attu repository. +2. Navigate to the client directory by running `cd client` in the terminal. +3. Install dependencies by running `yarn install`. +4. To start the server in development mode, run `yarn start`. +5. Create a new branch for your PR by running `git checkout -b my-branch`. -### Build server +### Submitting a Pull Request -1. Fork and clone the repo -2. `cd server` go to the server directory -3. `yarn install` to install dependencies -4. Create a branch for your PR +1. Make changes and ensure that tests pass. +2. Commit changes and push to your fork. +3. Create a Pull Request targeting the main branch of Attu. -### Build client +We appreciate your contributions to Attu, regardless of size. Thanks for supporting the project! -1. Fork and clone the repo -2. `cd client` go to the client directory -3. `yarn install` to install dependencies -4. Create a branch for your PR +#### ❓ Do you have any questions or problems? -### Milvus +If you encounter any bugs or want to request a new feature, please create a [GitHub issue](https://github.com/zilliztech/attu/issues/new/choose). It's important to check if someone else has already created an issue for the same problem before submitting a new one. -New to milvus? [Milvus](https://milvus.io) is an open-source vector database built to power AI applications and embedding similarity search. +### Milvus: A cloud-native vector database with high-performance and high scalability. -### Userful links +If you're new to Milvus, it is an open-source vector database that has been designed to power AI applications and embedding similarity search. It is a powerful tool that allows you to handle vast amounts of data with ease. -- [Milvus docs](https://milvus.io/docs) -- [Milvus python sdk](https://github.com/milvus-io/pymilvus) -- [Milvus java sdk](https://github.com/milvus-io/milvus-sdk-java) -- [Milvus gp sdk](https://github.com/milvus-io/milvus-sdk-go) -- [Milvus node sdk](https://github.com/milvus-io/milvus-sdk-node) -- [Feder](https://github.com/zilliztech/feder) +Here are some helpful resources to get you started with Milvus: -#### ❓ Questions? Problems? +- [Milvus documentation](https://milvus.io/docs): Here, you can find detailed information on how to use Milvus, including installation instructions, tutorials, and API documentation. -- If you've found a bug or want to request a feature, please create a [GitHub Issue](https://github.com/zilliztech/attu/issues/new/choose). - Please check to make sure someone else hasn't already created an issue for the same topic. +- [Milvus python SDK](https://github.com/milvus-io/pymilvus): The Python SDK allows you to interact with Milvus using Python. It provides a simple and intuitive interface for creating and querying vectors. -[milvus-doc]: https://milvus.io/docs +- [Milvus Java SDK](https://github.com/milvus-io/milvus-sdk-java): The Java SDK is similar to the Python SDK but designed for Java developers. It also provides a simple and intuitive interface for creating and querying vectors. + +- [Milvus Go SDK](https://github.com/milvus-io/milvus-sdk-go): The Go SDK provides a Go API for Milvus. If you're a Go developer, this is the SDK for you. + +- [Milvus Node SDK](https://github.com/milvus-io/milvus-sdk-node): The Node SDK provides a Node.js API for Milvus. If you're a Node.js developer, this is the SDK for you. + +- [Feder](https://github.com/zilliztech/feder): Feder is a distributed search engine that is built on top of Milvus. It provides a high-level API for distributed search and is designed to work seamlessly with Milvus. ## Community -πŸ’¬ Community isn’t just about writing code together. Come join the conversation, share your knowledge and get your questions answered on [Milvus Slack Channel](https://join.slack.com/t/milvusio/shared_invite/zt-e0u4qu3k-bI2GDNys3ZqX1YCJ9OM~GQ)! +πŸ’¬ Join our vibrant community on the Milvus Slack Channel where you can share your knowledge, ask questions and engage in meaningful conversations. It's not just about coding, it's about connecting with other like-minded individuals. Click the link below to join now! - + Miluvs Slack Channel + +Also, don't forget to check out our documentation and GitHub repositories for more resources and information. We look forward to seeing you on the channel! From c0ae48270ae78fd2a8e3a31774203f3699a6c428 Mon Sep 17 00:00:00 2001 From: shanghaikid Date: Fri, 17 Mar 2023 14:27:40 +0800 Subject: [PATCH 3/7] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ef231908..5b16e165 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ Here are some helpful resources to get you started with Milvus: - [Milvus Node SDK](https://github.com/milvus-io/milvus-sdk-node): The Node SDK provides a Node.js API for Milvus. If you're a Node.js developer, this is the SDK for you. -- [Feder](https://github.com/zilliztech/feder): Feder is a distributed search engine that is built on top of Milvus. It provides a high-level API for distributed search and is designed to work seamlessly with Milvus. +- [Feder](https://github.com/zilliztech/feder): Feder is a JavaScript tool designed to aid in the comprehension of embedding vectors. ## Community From 40b0cc1b10dda8f3546e7d2dc9a877c8d790ace7 Mon Sep 17 00:00:00 2001 From: shanghaikid Date: Fri, 17 Mar 2023 14:31:18 +0800 Subject: [PATCH 4/7] update readme --- README.md | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/README.md b/README.md index 5b16e165..aff51adf 100644 --- a/README.md +++ b/README.md @@ -83,22 +83,14 @@ We appreciate your contributions to Attu, regardless of size. Thanks for support If you encounter any bugs or want to request a new feature, please create a [GitHub issue](https://github.com/zilliztech/attu/issues/new/choose). It's important to check if someone else has already created an issue for the same problem before submitting a new one. -### Milvus: A cloud-native vector database with high-performance and high scalability. - -If you're new to Milvus, it is an open-source vector database that has been designed to power AI applications and embedding similarity search. It is a powerful tool that allows you to handle vast amounts of data with ease. - +### Userful links Here are some helpful resources to get you started with Milvus: - [Milvus documentation](https://milvus.io/docs): Here, you can find detailed information on how to use Milvus, including installation instructions, tutorials, and API documentation. - - [Milvus python SDK](https://github.com/milvus-io/pymilvus): The Python SDK allows you to interact with Milvus using Python. It provides a simple and intuitive interface for creating and querying vectors. - - [Milvus Java SDK](https://github.com/milvus-io/milvus-sdk-java): The Java SDK is similar to the Python SDK but designed for Java developers. It also provides a simple and intuitive interface for creating and querying vectors. - - [Milvus Go SDK](https://github.com/milvus-io/milvus-sdk-go): The Go SDK provides a Go API for Milvus. If you're a Go developer, this is the SDK for you. - - [Milvus Node SDK](https://github.com/milvus-io/milvus-sdk-node): The Node SDK provides a Node.js API for Milvus. If you're a Node.js developer, this is the SDK for you. - - [Feder](https://github.com/zilliztech/feder): Feder is a JavaScript tool designed to aid in the comprehension of embedding vectors. ## Community From 2b70863623cdaf8b149b76327df1b28fc4140686 Mon Sep 17 00:00:00 2001 From: shanghaikid Date: Fri, 17 Mar 2023 15:16:52 +0800 Subject: [PATCH 5/7] support AUTOINDEX --- client/src/consts/Milvus.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/src/consts/Milvus.tsx b/client/src/consts/Milvus.tsx index be202852..71b5587a 100644 --- a/client/src/consts/Milvus.tsx +++ b/client/src/consts/Milvus.tsx @@ -97,6 +97,10 @@ export const FLOAT_INDEX_CONFIG: indexConfigType = { create: ['n_trees'], search: ['search_k'], }, + AUTOINDEX: { + create: [], + search: [], + }, // RNSG: { // create: ['out_degree', 'candidate_pool_size', 'search_length', 'knng'], // search: ['search_length'], From aac67f0973f9a07f3079482b7071839c04f0c4dd Mon Sep 17 00:00:00 2001 From: shanghaikid Date: Fri, 17 Mar 2023 15:22:34 +0800 Subject: [PATCH 6/7] update nls --- client/src/i18n/cn/button.ts | 1 + client/src/i18n/cn/collection.ts | 13 ++++++++++++- client/src/i18n/cn/dialog.ts | 1 + client/src/i18n/cn/overview.ts | 4 ++-- client/src/i18n/cn/prometheus.ts | 2 +- client/src/i18n/cn/success.ts | 1 + client/src/i18n/en/success.ts | 2 +- 7 files changed, 19 insertions(+), 5 deletions(-) diff --git a/client/src/i18n/cn/button.ts b/client/src/i18n/cn/button.ts index 4a2010ae..0e1de520 100644 --- a/client/src/i18n/cn/button.ts +++ b/client/src/i18n/cn/button.ts @@ -23,6 +23,7 @@ const btnTrans = { loading: 'Loading...', importing: 'Importing...', example: 'Example', + rename: 'Rename', }; export default btnTrans; diff --git a/client/src/i18n/cn/collection.ts b/client/src/i18n/cn/collection.ts index d7ba9320..599e5a5c 100644 --- a/client/src/i18n/cn/collection.ts +++ b/client/src/i18n/cn/collection.ts @@ -7,6 +7,9 @@ const collectionTrans = { create: 'Create Collection', delete: 'delete', deleteTooltip: 'Please select at least one item to delete.', + rename: 'rename', + renameTooltip: 'Please select one item to rename.', + newColName: 'New Collection Name', alias: 'Alias', aliasTooltip: 'Please select one collection to create alias', download: 'Download', @@ -58,8 +61,11 @@ const collectionTrans = { // load dialog loadTitle: 'Load Collection', loadContent: - 'You are trying to load a collection with data. Only loaded collection can be searched.', + 'All search and query operations within Milvus are executed in memory, only loaded collection can be searched.', loadConfirmLabel: 'Load', + replicaNum: 'Replica number', + replicaDes: `With in-memory replicas, Milvus can load the same segment on multiple query nodes. The replica number can not exceed query node count.`, + enableRepica: `Enable in-memory replica`, // release dialog releaseTitle: 'Release Collection', @@ -82,6 +88,11 @@ const collectionTrans = { // alias dialog aliasCreatePlaceholder: 'Alias name', + + // rename dialog + newColNamePlaceholder: 'New Collection Name', + newNameInfo: + 'Only numbers, letters, and underscores are allowed.', }; export default collectionTrans; diff --git a/client/src/i18n/cn/dialog.ts b/client/src/i18n/cn/dialog.ts index b4a812bc..91d5971c 100644 --- a/client/src/i18n/cn/dialog.ts +++ b/client/src/i18n/cn/dialog.ts @@ -2,6 +2,7 @@ const dialogTrans = { deleteTipAction: 'Type', deleteTipPurpose: 'to confirm.', deleteTitle: `Drop {{type}}`, + renameTitle: `Rename {{type}}`, releaseTitle: `Release {{type}}`, createAlias: `Create alias for {{type}}`, loadTitle: `Load {{type}}`, diff --git a/client/src/i18n/cn/overview.ts b/client/src/i18n/cn/overview.ts index 8da1b641..e00c49f4 100644 --- a/client/src/i18n/cn/overview.ts +++ b/client/src/i18n/cn/overview.ts @@ -1,8 +1,8 @@ const overviewTrans = { load: 'Loaded Collections', all: 'All Collections', - data: 'Data', - rows: '{{number}} Entities', + data: 'Entites', + rows: '{{number}}', loading: 'Loading Collections', }; diff --git a/client/src/i18n/cn/prometheus.ts b/client/src/i18n/cn/prometheus.ts index c704a512..3b3f4cc7 100644 --- a/client/src/i18n/cn/prometheus.ts +++ b/client/src/i18n/cn/prometheus.ts @@ -1,7 +1,7 @@ const prometheusTrans = { ready: 'Prometheus is ready.', invalid: 'Prometheus configuration is invalid.', - + totalCount: 'Total Count', searchCount: 'Search Count', searchLatency: 'Search Latency', diff --git a/client/src/i18n/cn/success.ts b/client/src/i18n/cn/success.ts index a4a48d8d..d18756ae 100644 --- a/client/src/i18n/cn/success.ts +++ b/client/src/i18n/cn/success.ts @@ -5,6 +5,7 @@ const successTrans = { delete: `{{name}} successfully dropped.`, release: `{{name}} has been released.`, update: `{{name}} has been updated.`, + rename: `{{name}} has been renamed.`, }; export default successTrans; diff --git a/client/src/i18n/en/success.ts b/client/src/i18n/en/success.ts index 6bd272ba..d18756ae 100644 --- a/client/src/i18n/en/success.ts +++ b/client/src/i18n/en/success.ts @@ -5,7 +5,7 @@ const successTrans = { delete: `{{name}} successfully dropped.`, release: `{{name}} has been released.`, update: `{{name}} has been updated.`, - rename: `{{name}} has been updated.`, + rename: `{{name}} has been renamed.`, }; export default successTrans; From 5c40ff89eb009cbb0093e3c48a4403999c381deb Mon Sep 17 00:00:00 2001 From: shanghaikid Date: Fri, 17 Mar 2023 15:27:43 +0800 Subject: [PATCH 7/7] update --- client/src/consts/Milvus.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/consts/Milvus.tsx b/client/src/consts/Milvus.tsx index 71b5587a..77332cc2 100644 --- a/client/src/consts/Milvus.tsx +++ b/client/src/consts/Milvus.tsx @@ -97,10 +97,10 @@ export const FLOAT_INDEX_CONFIG: indexConfigType = { create: ['n_trees'], search: ['search_k'], }, - AUTOINDEX: { - create: [], - search: [], - }, + // AUTOINDEX: { + // create: [], + // search: [], + // }, // RNSG: { // create: ['out_degree', 'candidate_pool_size', 'search_length', 'knng'], // search: ['search_length'],