Skip to content

Commit a3351f1

Browse files
Poiskyningshuo
andauthored
feat: add support for Lindorm (#718)
* feat: add support for Lindorm * feat:add retry and vector_number_of_regions setting * feat:add description in pyproject.toml and README.md Co-authored-by: ningshuo <zhangzongning.zzn@alibaba-inc.com>
1 parent a379b6f commit a3351f1

12 files changed

Lines changed: 970 additions & 0 deletions

File tree

README.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ All the database client supported
6565
| doris | `pip install vectordb-bench[doris]` |
6666
| zvec | `pip install vectordb-bench[zvec]` |
6767
| endee | `pip install vectordb-bench[endee]` |
68+
| lindorm | `pip install vectordb-bench[lindorm]` |
6869

6970
### Run
7071

@@ -481,6 +482,51 @@ Mote options:
481482
--no-index Create table without ANN index
482483
```
483484

485+
### Run Lindorm from command line
486+
487+
Lindorm supports index types: hnsw, ivfpq, or ivfbq.
488+
489+
**Example: Run hnsw index test**
490+
491+
```shell
492+
vectordbbench lindormhnsw --case-type Performance768D10M --index-name <index_name> --k 10 \
493+
--host <lindorm_host> --port <lindorm_port> --user <username> --password <password> --m 32 \
494+
--ef-construction 400 --ef-search 150
495+
```
496+
497+
**Example: Run ivfpq index test**
498+
499+
```shell
500+
vectordbbench lindormivfpq --case-type Performance768D10M \
501+
--index-name <index_name> --k 10 --host <lindorm_host> --port <lindorm_port> \
502+
--user <username> --password <password> --lists <nlist> --probes <nprobe> \
503+
--m 32 --ef-construction 500 --ef-search 200 --reorder-factor 2
504+
```
505+
506+
**Example: Run ivfbq index test**
507+
508+
```shell
509+
vectordbbench lindormivfbq --case-type Performance768D10M --index-name <index_name> \
510+
--k 10 --host <index_name> --port <lindorm_port> \
511+
--user <username> --password <password> --lists <nlist> --probes <nprobe> \
512+
--exbits 2 --m 32 --ef-construction 500 --ef-search 200 --reorder-factor 2
513+
```
514+
515+
To list the options for Lindorm, execute `vectordbbench lindormhnsw --help`, The following are some Lindorm-specific command-line options.
516+
517+
```text
518+
--host TEXT host connection string [required]
519+
--port INTEGER Db Port [required]
520+
--user TEXT Db username [required]
521+
--password TEXT Db password [required]
522+
--index-name TEXT Db index name [required]
523+
--filter-type TEXT post_filter|pre_filter|efficient_filter
524+
--number-of-regions INTEGER Vector number of regions
525+
--m INTEGER hnsw m [required]
526+
--ef-construction INTEGER hnsw ef-construction [required]
527+
--ef-search INTEGER hnsw ef-search [required]
528+
```
529+
484530
#### Using a configuration file.
485531

486532
The vectordbbench command can optionally read some or all the options from a yaml formatted configuration file.

install/requirements_py3.11.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ qdrant-client
44
pinecone
55
weaviate-client
66
elasticsearch==8.16.0
7+
opensearch-py
78
pgvector
89
pgvecto_rs[psycopg3]>=0.2.1
910
sqlalchemy

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ doris = [ "doris-vector-search" ]
110110
turbopuffer = [ "turbopuffer" ]
111111
zvec = [ "zvec" ]
112112
endee = [ "endee==0.1.10" ]
113+
lindorm = [ "opensearch-py" ]
113114

114115
[project.urls]
115116
Repository = "https://github.com/zilliztech/VectorDBBench"

vectordb_bench/backend/clients/__init__.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class DB(Enum):
5858
TurboPuffer = "TurboPuffer"
5959
Zvec = "Zvec"
6060
Endee = "Endee"
61+
Lindorm = "Lindorm"
6162

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

241242
return Zvec
242243

244+
if self == DB.Lindorm:
245+
from .lindorm.lindorm_search import LindormVector
246+
247+
return LindormVector
248+
243249
msg = f"Unknown DB: {self.name}"
244250
raise ValueError(msg)
245251

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

425431
return ZvecConfig
426432

433+
if self == DB.Lindorm:
434+
from .lindorm.config import LindormConfig
435+
436+
return LindormConfig
437+
427438
msg = f"Unknown DB: {self.name}"
428439
raise ValueError(msg)
429440

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

586597
return ChromaIndexConfig
587598

599+
if self == DB.Lindorm:
600+
from .lindorm.config import _lindorm_vector_case_config
601+
602+
return _lindorm_vector_case_config.get(index_type)
603+
588604
# DB.Pinecone, DB.Redis
589605
return EmptyDBCaseConfig
590606

vectordb_bench/backend/clients/api.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class IndexType(StrEnum):
2626
STREAMING_DISKANN = "DISKANN"
2727
IVFFlat = "IVF_FLAT"
2828
IVFPQ = "IVF_PQ"
29+
IVFBQ = "IVF_BQ"
2930
IVFSQ8 = "IVF_SQ8"
3031
IVF_RABITQ = "IVF_RABITQ"
3132
Flat = "FLAT"
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
from typing import Annotated, Unpack
2+
3+
import click
4+
from pydantic import SecretStr
5+
6+
from vectordb_bench.backend.clients import DB
7+
from vectordb_bench.cli.cli import (
8+
CommonTypedDict,
9+
HNSWFlavor3,
10+
IVFFlatTypedDictN,
11+
cli,
12+
click_parameter_decorators_from_typed_dict,
13+
run,
14+
)
15+
16+
17+
class LindormTypedDict(CommonTypedDict):
18+
host: Annotated[str, click.option("--host", type=str, help="host connection string", required=True)]
19+
20+
port: Annotated[int, click.option("--port", type=int, default=30070, help="Db Port", required=True)]
21+
22+
user: Annotated[str, click.option("--user", type=str, help="Db username", required=True)]
23+
24+
password: Annotated[str, click.option("--password", type=str, help="Db password", required=True)]
25+
26+
index_name: Annotated[str, click.option("--index-name", type=str, help="Db index name", required=True)]
27+
28+
filter_type: Annotated[
29+
str, click.option("--filter-type", type=str, help="post_filter|pre_filter|efficient_filter", required=False)
30+
]
31+
32+
number_of_regions: Annotated[
33+
int, click.option("--number-of-regions", type=int, default=1, help="Vector number of regions", required=False)
34+
]
35+
36+
37+
class LindormHNSWTypedDict(CommonTypedDict, LindormTypedDict, HNSWFlavor3): ...
38+
39+
40+
@cli.command()
41+
@click_parameter_decorators_from_typed_dict(LindormHNSWTypedDict)
42+
def LindormHNSW(**parameters: Unpack[LindormHNSWTypedDict]):
43+
from .config import HNSWConfig, LindormConfig
44+
45+
run(
46+
db=DB.Lindorm,
47+
db_config=LindormConfig(
48+
host=parameters["host"],
49+
port=parameters["port"],
50+
user=parameters["user"],
51+
password=SecretStr(parameters["password"]),
52+
index_name=parameters["index_name"],
53+
),
54+
db_case_config=HNSWConfig(
55+
M=parameters["m"],
56+
efConstruction=parameters["ef_construction"],
57+
efSearch=parameters["ef_search"],
58+
filter_type=parameters["filter_type"],
59+
number_of_regions=parameters["number_of_regions"],
60+
),
61+
**parameters,
62+
)
63+
64+
65+
class LindormIVFBQTypedMinDict(CommonTypedDict, LindormTypedDict, IVFFlatTypedDictN):
66+
exbits: Annotated[str, click.option("--exbits", type=int, help="Exbits", required=True)]
67+
68+
69+
class LindormIVFPQTypedDict(CommonTypedDict, LindormTypedDict, IVFFlatTypedDictN, HNSWFlavor3):
70+
reorder_factor: Annotated[str, click.option("--reorder-factor", type=str, help="reorder factor", required=False)]
71+
72+
client_refactor: Annotated[
73+
bool, click.option("--client-refactor", type=bool, help="client refactor", required=False)
74+
]
75+
76+
k_expand_scope: Annotated[int, click.option("--k-expand-scope", type=int, help="k expand scope", required=False)]
77+
78+
79+
@cli.command()
80+
@click_parameter_decorators_from_typed_dict(LindormIVFPQTypedDict)
81+
def LindormIVFPQ(**parameters: Unpack[LindormIVFPQTypedDict]):
82+
from .config import IVFPQConfig, LindormConfig
83+
84+
run(
85+
db=DB.Lindorm,
86+
db_config=LindormConfig(
87+
host=parameters["host"],
88+
port=parameters["port"],
89+
user=parameters["user"],
90+
password=SecretStr(parameters["password"]),
91+
index_name=parameters["index_name"],
92+
),
93+
db_case_config=IVFPQConfig(
94+
nlist=parameters["nlist"],
95+
nprobe=parameters["nprobe"],
96+
centroids_hnsw_M=parameters["m"],
97+
centroids_hnsw_efConstruction=parameters["ef_construction"],
98+
centroids_hnsw_efSearch=parameters["ef_search"],
99+
filter_type=parameters["filter_type"],
100+
reorder_factor=parameters["reorder_factor"],
101+
client_refactor=parameters["client_refactor"],
102+
k_expand_scope=parameters["k_expand_scope"],
103+
number_of_regions=parameters["number_of_regions"],
104+
),
105+
**parameters,
106+
)
107+
108+
109+
class LindormIVFBQTypedDict(CommonTypedDict, LindormTypedDict, LindormIVFBQTypedMinDict, HNSWFlavor3):
110+
reorder_factor: Annotated[str, click.option("--reorder-factor", type=str, help="reorder factor", required=False)]
111+
112+
client_refactor: Annotated[
113+
bool, click.option("--client-refactor", type=bool, help="client refactor", required=False)
114+
]
115+
116+
k_expand_scope: Annotated[int, click.option("--k-expand-scope", type=int, help="k expand scope", required=False)]
117+
118+
119+
@cli.command()
120+
@click_parameter_decorators_from_typed_dict(LindormIVFBQTypedDict)
121+
def LindormIVFBQ(**parameters: Unpack[LindormIVFBQTypedDict]):
122+
from .config import IVFBQConfig, LindormConfig
123+
124+
run(
125+
db=DB.Lindorm,
126+
db_config=LindormConfig(
127+
host=parameters["host"],
128+
port=parameters["port"],
129+
user=parameters["user"],
130+
password=SecretStr(parameters["password"]),
131+
index_name=parameters["index_name"],
132+
),
133+
db_case_config=IVFBQConfig(
134+
nlist=parameters["nlist"],
135+
exbits=parameters["exbits"],
136+
nprobe=parameters["nprobe"],
137+
centroids_hnsw_M=parameters["m"],
138+
centroids_hnsw_efConstruction=parameters["ef_construction"],
139+
centroids_hnsw_efSearch=parameters["ef_search"],
140+
filter_type=parameters["filter_type"],
141+
reorder_factor=parameters["reorder_factor"],
142+
client_refactor=parameters["client_refactor"],
143+
k_expand_scope=parameters["k_expand_scope"],
144+
number_of_regions=parameters["number_of_regions"],
145+
),
146+
**parameters,
147+
)

0 commit comments

Comments
 (0)