Skip to main content

Install & Configure

Hint

This article is generated by AI translation.

Add Dependency

Before using jdbc-milvus, you need to add the corresponding Maven dependency to your project. Current version: 6.7.0

<dependency>
<groupId>net.hasor</groupId>
<artifactId>jdbc-milvus</artifactId>
<version>6.7.0</version> <!-- Please use the latest version -->
</dependency>

JDBC Connection

Connect using the standard JDBC URL format.

jdbc:dbvisitor:milvus://<host>:<port>/<database>?<parameters>
  • host: Milvus server address.
  • port: Milvus gRPC port (default 19530).
  • database: Database name (default default).
  • parameters: Connection parameters, see Connection Parameters for details.

In cluster mode, multiple hosts are separated by ; and can include health check ports:

jdbc:dbvisitor:milvus://host1:19530:9091;host2:19530:9091/default

Example Code

1. Create Collection and Index

String url = "jdbc:dbvisitor:milvus://127.0.0.1:19530/default";
try (Connection conn = DriverManager.getConnection(url)) {
try (Statement stmt = conn.createStatement()) {
// Create Collection
stmt.executeUpdate("CREATE TABLE book_vectors ("
+ "book_id int64 PRIMARY KEY, "
+ "word_count int64, "
+ "book_intro float_vector(2)"
+ ")");

// Create Vector Index
stmt.executeUpdate("CREATE INDEX idx_book_intro ON book_vectors (book_intro) "
+ "USING \"IVF_FLAT\" WITH (nlist = 1024, metric_type = \"L2\")");

// Load Collection into Memory (must be done before searching)
stmt.executeUpdate("LOAD TABLE book_vectors");
}
}

2. Insert Data with PreparedStatement

String insertSql = "INSERT INTO book_vectors (book_id, word_count, book_intro) VALUES (?, ?, ?)";
try (PreparedStatement ps = conn.prepareStatement(insertSql)) {
ps.setLong(1, 1L);
ps.setLong(2, 1000L);
ps.setObject(3, Arrays.asList(0.1f, 0.2f)); // Use List<Float> for vectors
ps.executeUpdate();
}

3. Vector Search (KNN)

Use ORDER BY vector_field <-> vector LIMIT n syntax to perform nearest neighbor search.

String searchSql = "SELECT book_id, word_count FROM book_vectors "
+ "ORDER BY book_intro <-> ? LIMIT 5";
try (PreparedStatement ps = conn.prepareStatement(searchSql)) {
ps.setObject(1, Arrays.asList(0.1f, 0.2f));
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.println("ID: " + rs.getLong("book_id")
+ ", Count: " + rs.getLong("word_count"));
}
}
}

Use WHERE vector_field <-> vector < radius or the vector_range function for range search.

// Method 1: Comparison expression
String rangeSql1 = "SELECT * FROM book_vectors WHERE book_intro <-> [0.1, 0.2] < 0.5";

// Method 2: vector_range function (recommended)
String rangeSql2 = "SELECT * FROM book_vectors WHERE vector_range(book_intro, [0.1, 0.2], 0.5)";

try (Statement stmt = conn.createStatement()) {
try (ResultSet rs = stmt.executeQuery(rangeSql2)) {
while (rs.next()) {
System.out.println("ID: " + rs.getLong("book_id"));
}
}
}

5. Scalar Filter Query

try (Statement stmt = conn.createStatement()) {
try (ResultSet rs = stmt.executeQuery(
"SELECT book_id, word_count FROM book_vectors WHERE word_count > 500 LIMIT 10")) {
while (rs.next()) {
System.out.println("ID: " + rs.getLong("book_id"));
}
}
}
String sql = "SELECT book_id FROM book_vectors "
+ "WHERE word_count > 500 "
+ "ORDER BY book_intro <-> [0.1, 0.2] LIMIT 3";
try (Statement stmt = conn.createStatement()) {
try (ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
System.out.println("ID: " + rs.getLong("book_id"));
}
}
}

7. Using Hints

Override query behavior through SQL Hints.

try (Statement stmt = conn.createStatement()) {
// Override LIMIT and OFFSET
ResultSet rs = stmt.executeQuery(
"/*+ overwrite_find_limit=5, overwrite_find_skip=10 */ "
+ "SELECT * FROM book_vectors WHERE word_count > 0");

// Convert query to COUNT
ResultSet countRs = stmt.executeQuery(
"/*+ overwrite_find_as_count=true */ "
+ "SELECT * FROM book_vectors WHERE word_count > 500");
}