mirror of
https://github.com/lancedb/lancedb.git
synced 2025-12-25 06:19:57 +00:00
94 lines
2.8 KiB
TypeScript
94 lines
2.8 KiB
TypeScript
// SPDX-License-Identifier: Apache-2.0
|
|
// SPDX-FileCopyrightText: Copyright The LanceDB Authors
|
|
import { expect, test } from "@jest/globals";
|
|
// --8<-- [start:import]
|
|
import * as lancedb from "@lancedb/lancedb";
|
|
// --8<-- [end:import]
|
|
// --8<-- [start:import_bin_util]
|
|
import { Field, FixedSizeList, Int32, Schema, Uint8 } from "apache-arrow";
|
|
// --8<-- [end:import_bin_util]
|
|
import { withTempDirectory } from "./util.ts";
|
|
|
|
test("vector search", async () => {
|
|
await withTempDirectory(async (databaseDir) => {
|
|
{
|
|
const db = await lancedb.connect(databaseDir);
|
|
|
|
const data = Array.from({ length: 10_000 }, (_, i) => ({
|
|
vector: Array(128).fill(i),
|
|
id: `${i}`,
|
|
}));
|
|
|
|
await db.createTable("my_vectors", data);
|
|
}
|
|
|
|
// --8<-- [start:search1]
|
|
const db = await lancedb.connect(databaseDir);
|
|
const tbl = await db.openTable("my_vectors");
|
|
|
|
const results1 = await tbl.search(Array(128).fill(1.2)).limit(10).toArray();
|
|
// --8<-- [end:search1]
|
|
expect(results1.length).toBe(10);
|
|
|
|
// --8<-- [start:search2]
|
|
const results2 = await (
|
|
tbl.search(Array(128).fill(1.2)) as lancedb.VectorQuery
|
|
)
|
|
.distanceType("cosine")
|
|
.limit(10)
|
|
.toArray();
|
|
// --8<-- [end:search2]
|
|
expect(results2.length).toBe(10);
|
|
|
|
// --8<-- [start:distance_range]
|
|
const results3 = await (
|
|
tbl.search(Array(128).fill(1.2)) as lancedb.VectorQuery
|
|
)
|
|
.distanceType("cosine")
|
|
.distanceRange(0.1, 0.2)
|
|
.limit(10)
|
|
.toArray();
|
|
// --8<-- [end:distance_range]
|
|
for (const r of results3) {
|
|
expect(r.distance).toBeGreaterThanOrEqual(0.1);
|
|
expect(r.distance).toBeLessThan(0.2);
|
|
}
|
|
|
|
{
|
|
// --8<-- [start:ingest_binary_data]
|
|
const schema = new Schema([
|
|
new Field("id", new Int32(), true),
|
|
new Field("vec", new FixedSizeList(32, new Field("item", new Uint8()))),
|
|
]);
|
|
const data = lancedb.makeArrowTable(
|
|
Array(1_000)
|
|
.fill(0)
|
|
.map((_, i) => ({
|
|
// the 256 bits would be store in 32 bytes,
|
|
// if your data is already in this format, you can skip the packBits step
|
|
id: i,
|
|
vec: lancedb.packBits(Array(256).fill(i % 2)),
|
|
})),
|
|
{ schema: schema },
|
|
);
|
|
|
|
const tbl = await db.createTable("binary_table", data);
|
|
await tbl.createIndex("vec", {
|
|
config: lancedb.Index.ivfFlat({
|
|
numPartitions: 10,
|
|
distanceType: "hamming",
|
|
}),
|
|
});
|
|
// --8<-- [end:ingest_binary_data]
|
|
|
|
// --8<-- [start:search_binary_data]
|
|
const query = Array(32)
|
|
.fill(1)
|
|
.map(() => Math.floor(Math.random() * 255));
|
|
const results = await tbl.query().nearestTo(query).limit(10).toArrow();
|
|
// --8<-- [end:search_binary_data
|
|
expect(results.numRows).toBe(10);
|
|
}
|
|
});
|
|
});
|