Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ All the database client supported
| doris | `pip install vectordb-bench[doris]` |
| zvec | `pip install vectordb-bench[zvec]` |
| endee | `pip install vectordb-bench[endee]` |
| lindorm | `pip install vectordb-bench[lindorm]` |

### Run

Expand Down Expand Up @@ -481,6 +482,51 @@ Mote options:
--no-index Create table without ANN index
```

### Run Lindorm from command line

Lindorm supports index types: hnsw, ivfpq, or ivfbq.

**Example: Run hnsw index test**

```shell
vectordbbench lindormhnsw --case-type Performance768D10M --index-name <index_name> --k 10 \
--host <lindorm_host> --port <lindorm_port> --user <username> --password <password> --m 32 \
--ef-construction 400 --ef-search 150
```

**Example: Run ivfpq index test**

```shell
vectordbbench lindormivfpq --case-type Performance768D10M \
--index-name <index_name> --k 10 --host <lindorm_host> --port <lindorm_port> \
--user <username> --password <password> --lists <nlist> --probes <nprobe> \
--m 32 --ef-construction 500 --ef-search 200 --reorder-factor 2
```

**Example: Run ivfbq index test**

```shell
vectordbbench lindormivfbq --case-type Performance768D10M --index-name <index_name> \
--k 10 --host <index_name> --port <lindorm_port> \
--user <username> --password <password> --lists <nlist> --probes <nprobe> \
--exbits 2 --m 32 --ef-construction 500 --ef-search 200 --reorder-factor 2
```

To list the options for Lindorm, execute `vectordbbench lindormhnsw --help`, The following are some Lindorm-specific command-line options.

```text
--host TEXT host connection string [required]
--port INTEGER Db Port [required]
--user TEXT Db username [required]
--password TEXT Db password [required]
--index-name TEXT Db index name [required]
--filter-type TEXT post_filter|pre_filter|efficient_filter
--number-of-regions INTEGER Vector number of regions
--m INTEGER hnsw m [required]
--ef-construction INTEGER hnsw ef-construction [required]
--ef-search INTEGER hnsw ef-search [required]
```

#### Using a configuration file.

The vectordbbench command can optionally read some or all the options from a yaml formatted configuration file.
Expand Down
1 change: 1 addition & 0 deletions install/requirements_py3.11.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ qdrant-client
pinecone
weaviate-client
elasticsearch==8.16.0
opensearch-py
pgvector
pgvecto_rs[psycopg3]>=0.2.1
sqlalchemy
Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ doris = [ "doris-vector-search" ]
turbopuffer = [ "turbopuffer" ]
zvec = [ "zvec" ]
endee = [ "endee==0.1.10" ]
lindorm = [ "opensearch-py" ]

[project.urls]
Repository = "https://github.com/zilliztech/VectorDBBench"
Expand Down
16 changes: 16 additions & 0 deletions vectordb_bench/backend/clients/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class DB(Enum):
TurboPuffer = "TurboPuffer"
Zvec = "Zvec"
Endee = "Endee"
Lindorm = "Lindorm"

@property
def init_cls(self) -> type[VectorDB]: # noqa: PLR0911, PLR0912, C901, PLR0915
Expand Down Expand Up @@ -240,6 +241,11 @@ def init_cls(self) -> type[VectorDB]: # noqa: PLR0911, PLR0912, C901, PLR0915

return Zvec

if self == DB.Lindorm:
from .lindorm.lindorm_search import LindormVector

return LindormVector

msg = f"Unknown DB: {self.name}"
raise ValueError(msg)

Expand Down Expand Up @@ -424,6 +430,11 @@ def config_cls(self) -> type[DBConfig]: # noqa: PLR0911, PLR0912, C901, PLR0915

return ZvecConfig

if self == DB.Lindorm:
from .lindorm.config import LindormConfig

return LindormConfig

msg = f"Unknown DB: {self.name}"
raise ValueError(msg)

Expand Down Expand Up @@ -585,6 +596,11 @@ def case_config_cls( # noqa: C901, PLR0911, PLR0912, PLR0915

return ChromaIndexConfig

if self == DB.Lindorm:
from .lindorm.config import _lindorm_vector_case_config

return _lindorm_vector_case_config.get(index_type)

# DB.Pinecone, DB.Redis
return EmptyDBCaseConfig

Expand Down
1 change: 1 addition & 0 deletions vectordb_bench/backend/clients/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class IndexType(StrEnum):
STREAMING_DISKANN = "DISKANN"
IVFFlat = "IVF_FLAT"
IVFPQ = "IVF_PQ"
IVFBQ = "IVF_BQ"
IVFSQ8 = "IVF_SQ8"
IVF_RABITQ = "IVF_RABITQ"
Flat = "FLAT"
Expand Down
147 changes: 147 additions & 0 deletions vectordb_bench/backend/clients/lindorm/cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
from typing import Annotated, Unpack

import click
from pydantic import SecretStr

from vectordb_bench.backend.clients import DB
from vectordb_bench.cli.cli import (
CommonTypedDict,
HNSWFlavor3,
IVFFlatTypedDictN,
cli,
click_parameter_decorators_from_typed_dict,
run,
)


class LindormTypedDict(CommonTypedDict):
host: Annotated[str, click.option("--host", type=str, help="host connection string", required=True)]

port: Annotated[int, click.option("--port", type=int, default=30070, help="Db Port", required=True)]

user: Annotated[str, click.option("--user", type=str, help="Db username", required=True)]

password: Annotated[str, click.option("--password", type=str, help="Db password", required=True)]

index_name: Annotated[str, click.option("--index-name", type=str, help="Db index name", required=True)]

filter_type: Annotated[
str, click.option("--filter-type", type=str, help="post_filter|pre_filter|efficient_filter", required=False)
]

number_of_regions: Annotated[
int, click.option("--number-of-regions", type=int, default=1, help="Vector number of regions", required=False)
]


class LindormHNSWTypedDict(CommonTypedDict, LindormTypedDict, HNSWFlavor3): ...


@cli.command()
@click_parameter_decorators_from_typed_dict(LindormHNSWTypedDict)
def LindormHNSW(**parameters: Unpack[LindormHNSWTypedDict]):
from .config import HNSWConfig, LindormConfig

run(
db=DB.Lindorm,
db_config=LindormConfig(
host=parameters["host"],
port=parameters["port"],
user=parameters["user"],
password=SecretStr(parameters["password"]),
index_name=parameters["index_name"],
),
db_case_config=HNSWConfig(
M=parameters["m"],
efConstruction=parameters["ef_construction"],
efSearch=parameters["ef_search"],
filter_type=parameters["filter_type"],
number_of_regions=parameters["number_of_regions"],
),
**parameters,
)


class LindormIVFBQTypedMinDict(CommonTypedDict, LindormTypedDict, IVFFlatTypedDictN):
exbits: Annotated[str, click.option("--exbits", type=int, help="Exbits", required=True)]


class LindormIVFPQTypedDict(CommonTypedDict, LindormTypedDict, IVFFlatTypedDictN, HNSWFlavor3):
reorder_factor: Annotated[str, click.option("--reorder-factor", type=str, help="reorder factor", required=False)]

client_refactor: Annotated[
bool, click.option("--client-refactor", type=bool, help="client refactor", required=False)
]

k_expand_scope: Annotated[int, click.option("--k-expand-scope", type=int, help="k expand scope", required=False)]


@cli.command()
@click_parameter_decorators_from_typed_dict(LindormIVFPQTypedDict)
def LindormIVFPQ(**parameters: Unpack[LindormIVFPQTypedDict]):
from .config import IVFPQConfig, LindormConfig

run(
db=DB.Lindorm,
db_config=LindormConfig(
host=parameters["host"],
port=parameters["port"],
user=parameters["user"],
password=SecretStr(parameters["password"]),
index_name=parameters["index_name"],
),
db_case_config=IVFPQConfig(
nlist=parameters["nlist"],
nprobe=parameters["nprobe"],
centroids_hnsw_M=parameters["m"],
centroids_hnsw_efConstruction=parameters["ef_construction"],
centroids_hnsw_efSearch=parameters["ef_search"],
filter_type=parameters["filter_type"],
reorder_factor=parameters["reorder_factor"],
client_refactor=parameters["client_refactor"],
k_expand_scope=parameters["k_expand_scope"],
number_of_regions=parameters["number_of_regions"],
),
**parameters,
)


class LindormIVFBQTypedDict(CommonTypedDict, LindormTypedDict, LindormIVFBQTypedMinDict, HNSWFlavor3):
reorder_factor: Annotated[str, click.option("--reorder-factor", type=str, help="reorder factor", required=False)]

client_refactor: Annotated[
bool, click.option("--client-refactor", type=bool, help="client refactor", required=False)
]

k_expand_scope: Annotated[int, click.option("--k-expand-scope", type=int, help="k expand scope", required=False)]


@cli.command()
@click_parameter_decorators_from_typed_dict(LindormIVFBQTypedDict)
def LindormIVFBQ(**parameters: Unpack[LindormIVFBQTypedDict]):
from .config import IVFBQConfig, LindormConfig

run(
db=DB.Lindorm,
db_config=LindormConfig(
host=parameters["host"],
port=parameters["port"],
user=parameters["user"],
password=SecretStr(parameters["password"]),
index_name=parameters["index_name"],
),
db_case_config=IVFBQConfig(
nlist=parameters["nlist"],
exbits=parameters["exbits"],
nprobe=parameters["nprobe"],
centroids_hnsw_M=parameters["m"],
centroids_hnsw_efConstruction=parameters["ef_construction"],
centroids_hnsw_efSearch=parameters["ef_search"],
filter_type=parameters["filter_type"],
reorder_factor=parameters["reorder_factor"],
client_refactor=parameters["client_refactor"],
k_expand_scope=parameters["k_expand_scope"],
number_of_regions=parameters["number_of_regions"],
),
**parameters,
)
Loading