HHH-17357 Rename hibernate-types module to hibernate-vector
This commit is contained in:
parent
6bbf58973e
commit
5e5ba17d1d
|
@ -34,7 +34,7 @@ include::chapters/query/hql/QueryLanguage.adoc[]
|
||||||
include::chapters/query/criteria/Criteria.adoc[]
|
include::chapters/query/criteria/Criteria.adoc[]
|
||||||
include::chapters/query/native/Native.adoc[]
|
include::chapters/query/native/Native.adoc[]
|
||||||
include::chapters/query/spatial/Spatial.adoc[]
|
include::chapters/query/spatial/Spatial.adoc[]
|
||||||
include::chapters/query/types/TypesModule.adoc[]
|
include::chapters/query/extensions/Vector.adoc[]
|
||||||
include::chapters/multitenancy/MultiTenancy.adoc[]
|
include::chapters/multitenancy/MultiTenancy.adoc[]
|
||||||
include::chapters/envers/Envers.adoc[]
|
include::chapters/envers/Envers.adoc[]
|
||||||
include::chapters/beans/Beans.adoc[]
|
include::chapters/beans/Beans.adoc[]
|
||||||
|
|
|
@ -1,32 +1,36 @@
|
||||||
[[types-module]]
|
[[vector-module]]
|
||||||
== Hibernate Types module
|
== Hibernate Vector module
|
||||||
:root-project-dir: ../../../../../../../..
|
:root-project-dir: ../../../../../../../..
|
||||||
:types-project-dir: {root-project-dir}/hibernate-types
|
:vector-project-dir: {root-project-dir}/hibernate-vector
|
||||||
:example-dir-types: {types-project-dir}/src/test/java/org/hibernate/types
|
:example-dir-vector: {vector-project-dir}/src/test/java/org/hibernate/vector
|
||||||
:extrasdir: extras
|
:extrasdir: extras
|
||||||
|
|
||||||
[[types-module-overview]]
|
[[vector-module-overview]]
|
||||||
=== Overview
|
=== Overview
|
||||||
|
|
||||||
The Hibernate ORM core module tries to be as minimal as possible and only model functionality
|
The Hibernate ORM Vector module contains support for mathematical vector types and functions.
|
||||||
that is somewhat "standard" in the SQL space or can only be modeled as part of the core module.
|
This is useful for AI/ML topics like vector similarity search.
|
||||||
To avoid growing that module further unnecessarily, support for certain special SQL types or functions
|
The module comes with support for a special `vector` data type that essentially represents an array of floats.
|
||||||
is separated out into the Hibernate ORM types module.
|
|
||||||
|
|
||||||
[[types-module-setup]]
|
So far, only the PostgreSQL extension `pgvector` is supported, but in theory,
|
||||||
|
the vector specific functions could be implemented to work with every database that supports arrays.
|
||||||
|
|
||||||
|
For further details, refer to the https://github.com/pgvector/pgvector#querying[pgvector documentation].
|
||||||
|
|
||||||
|
[[vector-module-setup]]
|
||||||
=== Setup
|
=== Setup
|
||||||
|
|
||||||
You need to include the `hibernate-types` dependency in your build environment.
|
You need to include the `hibernate-vector` dependency in your build environment.
|
||||||
For Maven, you need to add the following dependency:
|
For Maven, you need to add the following dependency:
|
||||||
|
|
||||||
[[types-module-setup-maven-example]]
|
[[vector-module-setup-maven-example]]
|
||||||
.Maven dependency
|
.Maven dependency
|
||||||
====
|
====
|
||||||
[source,xml]
|
[source,xml]
|
||||||
----
|
----
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.hibernate.orm</groupId>
|
<groupId>org.hibernate.orm</groupId>
|
||||||
<artifactId>hibernate-types</artifactId>
|
<artifactId>hibernate-vector</artifactId>
|
||||||
<version>${hibernate.version}</version>
|
<version>${hibernate.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
----
|
----
|
||||||
|
@ -35,37 +39,27 @@ For Maven, you need to add the following dependency:
|
||||||
The module contains service implementations that are picked up by the Java `ServiceLoader` automatically,
|
The module contains service implementations that are picked up by the Java `ServiceLoader` automatically,
|
||||||
so no further configuration is necessary to make the features available.
|
so no further configuration is necessary to make the features available.
|
||||||
|
|
||||||
[[types-module-vector]]
|
[[vector-module-usage]]
|
||||||
=== Vector type support
|
|
||||||
|
|
||||||
The Hibernate ORM types module comes with support for a special `vector` data type that essentially represents an array of floats.
|
|
||||||
|
|
||||||
So far, only the PostgreSQL extension `pgvector` is supported, but in theory,
|
|
||||||
the vector specific functions could be implemented to work with every database that supports arrays.
|
|
||||||
|
|
||||||
For further details, refer to the https://github.com/pgvector/pgvector#querying[pgvector documentation].
|
|
||||||
|
|
||||||
[[types-module-vector-usage]]
|
|
||||||
==== Usage
|
==== Usage
|
||||||
|
|
||||||
Annotate a persistent attribute with `@JdbcTypeCode(SqlTypes.VECTOR)` and specify the vector length with `@Array(length = ...)`.
|
Annotate a persistent attribute with `@JdbcTypeCode(SqlTypes.VECTOR)` and specify the vector length with `@Array(length = ...)`.
|
||||||
|
|
||||||
[[types-module-vector-usage-example]]
|
[[vector-module-usage-example]]
|
||||||
====
|
====
|
||||||
[source, JAVA, indent=0]
|
[source, JAVA, indent=0]
|
||||||
----
|
----
|
||||||
include::{example-dir-types}/vector/PGVectorTest.java[tags=usage-example]
|
include::{example-dir-vector}/PGVectorTest.java[tags=usage-example]
|
||||||
----
|
----
|
||||||
====
|
====
|
||||||
|
|
||||||
To cast the string representation of a vector to the vector data type, simply use an HQL cast i.e. `cast('[1,2,3]' as vector)`.
|
To cast the string representation of a vector to the vector data type, simply use an HQL cast i.e. `cast('[1,2,3]' as vector)`.
|
||||||
|
|
||||||
[[types-module-vector-functions]]
|
[[vector-module-functions]]
|
||||||
==== Functions
|
==== Functions
|
||||||
|
|
||||||
Expressions of the vector type can be used with various vector functions.
|
Expressions of the vector type can be used with various vector functions.
|
||||||
|
|
||||||
[[types-module-vector-functions-overview]]
|
[[vector-module-functions-overview]]
|
||||||
|===
|
|===
|
||||||
| Function | Purpose
|
| Function | Purpose
|
||||||
|
|
||||||
|
@ -88,89 +82,89 @@ In addition to these special vector functions, it is also possible to use vector
|
||||||
`sum(<vector1>) = <vector2>`:: Aggregate function support for element-wise summation of vectors.
|
`sum(<vector1>) = <vector2>`:: Aggregate function support for element-wise summation of vectors.
|
||||||
`avg(<vector1>) = <vector2>`:: Aggregate function support for element-wise average of vectors.
|
`avg(<vector1>) = <vector2>`:: Aggregate function support for element-wise average of vectors.
|
||||||
|
|
||||||
[[types-module-vector-functions-cosine-distance]]
|
[[vector-module-functions-cosine-distance]]
|
||||||
===== `cosine_distance()`
|
===== `cosine_distance()`
|
||||||
|
|
||||||
Computes the https://en.wikipedia.org/wiki/Cosine_similarity[cosine distance] between two vectors,
|
Computes the https://en.wikipedia.org/wiki/Cosine_similarity[cosine distance] between two vectors,
|
||||||
which is `1 - inner_product( v1, v2 ) / ( vector_norm( v1 ) * vector_norm( v2 ) )`. Maps to the `<``=``>` pgvector operator.
|
which is `1 - inner_product( v1, v2 ) / ( vector_norm( v1 ) * vector_norm( v2 ) )`. Maps to the `<``=``>` pgvector operator.
|
||||||
|
|
||||||
[[types-module-vector-functions-cosine-distance-example]]
|
[[vector-module-functions-cosine-distance-example]]
|
||||||
====
|
====
|
||||||
[source, JAVA, indent=0]
|
[source, JAVA, indent=0]
|
||||||
----
|
----
|
||||||
include::{example-dir-types}/vector/PGVectorTest.java[tags=cosine-distance-example]
|
include::{example-dir-vector}/PGVectorTest.java[tags=cosine-distance-example]
|
||||||
----
|
----
|
||||||
====
|
====
|
||||||
|
|
||||||
[[types-module-vector-functions-euclidean-distance]]
|
[[vector-module-functions-euclidean-distance]]
|
||||||
===== `euclidean_distance()` and `l2_distance()`
|
===== `euclidean_distance()` and `l2_distance()`
|
||||||
|
|
||||||
Computes the https://en.wikipedia.org/wiki/Euclidean_distance[euclidean distance] between two vectors,
|
Computes the https://en.wikipedia.org/wiki/Euclidean_distance[euclidean distance] between two vectors,
|
||||||
which is `sqrt( sum( (v1_i - v2_i)^2 ) )`. Maps to the `<``-``>` pgvector operator.
|
which is `sqrt( sum( (v1_i - v2_i)^2 ) )`. Maps to the `<``-``>` pgvector operator.
|
||||||
The `l2_distance()` function is an alias.
|
The `l2_distance()` function is an alias.
|
||||||
|
|
||||||
[[types-module-vector-functions-euclidean-distance-example]]
|
[[vector-module-functions-euclidean-distance-example]]
|
||||||
====
|
====
|
||||||
[source, JAVA, indent=0]
|
[source, JAVA, indent=0]
|
||||||
----
|
----
|
||||||
include::{example-dir-types}/vector/PGVectorTest.java[tags=euclidean-distance-example]
|
include::{example-dir-vector}/PGVectorTest.java[tags=euclidean-distance-example]
|
||||||
----
|
----
|
||||||
====
|
====
|
||||||
|
|
||||||
[[types-module-vector-functions-taxicab-distance]]
|
[[vector-module-functions-taxicab-distance]]
|
||||||
===== `taxicab_distance()` and `l1_distance()`
|
===== `taxicab_distance()` and `l1_distance()`
|
||||||
|
|
||||||
Computes the https://en.wikipedia.org/wiki/Taxicab_geometry[taxicab distance] between two vectors,
|
Computes the https://en.wikipedia.org/wiki/Taxicab_geometry[taxicab distance] between two vectors,
|
||||||
which is `vector_norm(v1) - vector_norm(v2)`.
|
which is `vector_norm(v1) - vector_norm(v2)`.
|
||||||
The `l1_distance()` function is an alias.
|
The `l1_distance()` function is an alias.
|
||||||
|
|
||||||
[[types-module-vector-functions-taxicab-distance-example]]
|
[[vector-module-functions-taxicab-distance-example]]
|
||||||
====
|
====
|
||||||
[source, JAVA, indent=0]
|
[source, JAVA, indent=0]
|
||||||
----
|
----
|
||||||
include::{example-dir-types}/vector/PGVectorTest.java[tags=taxicab-distance-example]
|
include::{example-dir-vector}/PGVectorTest.java[tags=taxicab-distance-example]
|
||||||
----
|
----
|
||||||
====
|
====
|
||||||
|
|
||||||
[[types-module-vector-functions-inner-product]]
|
[[vector-module-functions-inner-product]]
|
||||||
===== `inner_product()` and `negative_inner_product()`
|
===== `inner_product()` and `negative_inner_product()`
|
||||||
|
|
||||||
Computes the https://en.wikipedia.org/wiki/Inner_product_space[inner product] between two vectors,
|
Computes the https://en.wikipedia.org/wiki/Inner_product_space[inner product] between two vectors,
|
||||||
which is `sum( v1_i * v2_i )`. The `negative_inner_product()` function maps to the `<``#``>` pgvector operator,
|
which is `sum( v1_i * v2_i )`. The `negative_inner_product()` function maps to the `<``#``>` pgvector operator,
|
||||||
and the `inner_product()` function as well, but multiplies the result time `-1`.
|
and the `inner_product()` function as well, but multiplies the result time `-1`.
|
||||||
|
|
||||||
[[types-module-vector-functions-inner-product-example]]
|
[[vector-module-functions-inner-product-example]]
|
||||||
====
|
====
|
||||||
[source, JAVA, indent=0]
|
[source, JAVA, indent=0]
|
||||||
----
|
----
|
||||||
include::{example-dir-types}/vector/PGVectorTest.java[tags=inner-product-example]
|
include::{example-dir-vector}/PGVectorTest.java[tags=inner-product-example]
|
||||||
----
|
----
|
||||||
====
|
====
|
||||||
|
|
||||||
[[types-module-vector-functions-vector-dims]]
|
[[vector-module-functions-vector-dims]]
|
||||||
===== `vector_dims()`
|
===== `vector_dims()`
|
||||||
|
|
||||||
Determines the dimensions of a vector.
|
Determines the dimensions of a vector.
|
||||||
|
|
||||||
[[types-module-vector-functions-vector-dims-example]]
|
[[vector-module-functions-vector-dims-example]]
|
||||||
====
|
====
|
||||||
[source, JAVA, indent=0]
|
[source, JAVA, indent=0]
|
||||||
----
|
----
|
||||||
include::{example-dir-types}/vector/PGVectorTest.java[tags=vector-dims-example]
|
include::{example-dir-vector}/PGVectorTest.java[tags=vector-dims-example]
|
||||||
----
|
----
|
||||||
====
|
====
|
||||||
|
|
||||||
[[types-module-vector-functions-vector-norm]]
|
[[vector-module-functions-vector-norm]]
|
||||||
===== `vector_norm()`
|
===== `vector_norm()`
|
||||||
|
|
||||||
Computes the https://en.wikipedia.org/wiki/Euclidean_space#Euclidean_norm[Euclidean norm] of a vector,
|
Computes the https://en.wikipedia.org/wiki/Euclidean_space#Euclidean_norm[Euclidean norm] of a vector,
|
||||||
which is `sqrt( sum( v_i^2 ) )`.
|
which is `sqrt( sum( v_i^2 ) )`.
|
||||||
|
|
||||||
[[types-module-vector-functions-vector-norm-example]]
|
[[vector-module-functions-vector-norm-example]]
|
||||||
====
|
====
|
||||||
[source, JAVA, indent=0]
|
[source, JAVA, indent=0]
|
||||||
----
|
----
|
||||||
include::{example-dir-types}/vector/PGVectorTest.java[tags=vector-norm-example]
|
include::{example-dir-vector}/PGVectorTest.java[tags=vector-norm-example]
|
||||||
----
|
----
|
||||||
====
|
====
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
org.hibernate.types.vector.PGVectorFunctionContributor
|
|
|
@ -1 +0,0 @@
|
||||||
org.hibernate.types.vector.PGVectorTypeContributor
|
|
|
@ -5,7 +5,7 @@
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
description = 'Hibernate\'s type extensions'
|
description = 'Hibernate\'s extensions for vector support'
|
||||||
|
|
||||||
apply from: rootProject.file( 'gradle/published-java-module.gradle' )
|
apply from: rootProject.file( 'gradle/published-java-module.gradle' )
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.types.vector;
|
package org.hibernate.vector;
|
||||||
|
|
||||||
import org.hibernate.boot.model.FunctionContributions;
|
import org.hibernate.boot.model.FunctionContributions;
|
||||||
import org.hibernate.boot.model.FunctionContributor;
|
import org.hibernate.boot.model.FunctionContributor;
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.types.vector;
|
package org.hibernate.vector;
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.types.vector;
|
package org.hibernate.vector;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.types.vector;
|
package org.hibernate.vector;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.types.vector;
|
package org.hibernate.vector;
|
||||||
|
|
||||||
import java.sql.CallableStatement;
|
import java.sql.CallableStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
|
@ -0,0 +1 @@
|
||||||
|
org.hibernate.vector.PGVectorFunctionContributor
|
|
@ -0,0 +1 @@
|
||||||
|
org.hibernate.vector.PGVectorTypeContributor
|
|
@ -4,7 +4,7 @@
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.types.vector;
|
package org.hibernate.vector;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
|
@ -300,7 +300,7 @@ include 'hibernate-spatial'
|
||||||
include 'hibernate-platform'
|
include 'hibernate-platform'
|
||||||
|
|
||||||
include 'hibernate-community-dialects'
|
include 'hibernate-community-dialects'
|
||||||
include 'hibernate-types'
|
include 'hibernate-vector'
|
||||||
|
|
||||||
include 'hibernate-c3p0'
|
include 'hibernate-c3p0'
|
||||||
include 'hibernate-proxool'
|
include 'hibernate-proxool'
|
||||||
|
|
Loading…
Reference in New Issue