mirror of
https://github.com/spring-projects/spring-data-elasticsearch.git
synced 2025-06-08 13:12:10 +00:00
Compare commits
71 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
737650ac54 | ||
|
b3f21736b6 | ||
|
fbed601efa | ||
|
5f2d71ef32 | ||
|
2904427e9b | ||
|
167f2246d3 | ||
|
f09ce87f0e | ||
|
1d5c78a06a | ||
|
5a2dcd3b01 | ||
|
74b05d21b5 | ||
|
1895219322 | ||
|
bd62128b52 | ||
|
16eb208d77 | ||
|
0575323975 | ||
|
4289f73b24 | ||
|
7f246724d2 | ||
|
ce6b4d853f | ||
|
c87d106074 | ||
|
bf21b697ca | ||
|
eead581ff0 | ||
|
aef71db320 | ||
|
452c76fb12 | ||
|
c9a47997b9 | ||
|
4a42c673ce | ||
|
4729b9cfdc | ||
|
aa16c0c5ab | ||
|
5e507fa163 | ||
|
a355537d78 | ||
|
4fbf9f8b5a | ||
|
2cb27c26d7 | ||
|
c322797eab | ||
|
c81958f62d | ||
|
ed18be6f1c | ||
|
b3a21fbb7c | ||
|
d874b9d000 | ||
|
36e6a4b328 | ||
|
3710e47abd | ||
|
c40abc267b | ||
|
b479184d83 | ||
|
f2370bc7df | ||
|
5f045d104e | ||
|
b52e8d1431 | ||
|
e86bb771be | ||
|
c9fbc17109 | ||
|
397e155d5e | ||
|
4e52594d12 | ||
|
310f0ed567 | ||
|
dab0be04db | ||
|
e8f269d9ec | ||
|
1e9824ae2d | ||
|
c9b8b3f33d | ||
|
a806553169 | ||
|
27011d382b | ||
|
489a2605b4 | ||
|
953f840d7c | ||
|
d905a4b25f | ||
|
e2e6b5005b | ||
|
0d4e8ad6eb | ||
|
a9bacd23b0 | ||
|
031f7c8c78 | ||
|
76187a4934 | ||
|
b693494e17 | ||
|
b324935d22 | ||
|
920f7c029f | ||
|
051777ee25 | ||
|
0fb98eda39 | ||
|
df76b43cb4 | ||
|
b681197d0f | ||
|
8a1323c11a | ||
|
033d71ccb6 | ||
|
0ae2a52de8 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -33,4 +33,3 @@ node
|
|||||||
package-lock.json
|
package-lock.json
|
||||||
|
|
||||||
.mvn/.develocity
|
.mvn/.develocity
|
||||||
/src/test/resources/testcontainers-local.properties
|
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
<extension>
|
<extension>
|
||||||
<groupId>io.spring.develocity.conventions</groupId>
|
<groupId>io.spring.develocity.conventions</groupId>
|
||||||
<artifactId>develocity-conventions-maven-extension</artifactId>
|
<artifactId>develocity-conventions-maven-extension</artifactId>
|
||||||
<version>0.0.22</version>
|
<version>0.0.19</version>
|
||||||
</extension>
|
</extension>
|
||||||
</extensions>
|
</extensions>
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
|
|
||||||
--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
|
|
||||||
--add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED
|
|
||||||
--add-exports jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED
|
|
||||||
--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
|
|
||||||
--add-exports jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED
|
|
||||||
--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
|
|
||||||
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
|
|
||||||
--add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED
|
|
||||||
--add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED
|
|
||||||
--add-opens=java.base/java.util=ALL-UNNAMED
|
|
||||||
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED
|
|
||||||
--add-opens=java.base/java.text=ALL-UNNAMED
|
|
||||||
--add-opens=java.desktop/java.awt.font=ALL-UNNAMED
|
|
4
.mvn/wrapper/maven-wrapper.properties
vendored
4
.mvn/wrapper/maven-wrapper.properties
vendored
@ -1,3 +1,3 @@
|
|||||||
#Thu Nov 07 09:47:28 CET 2024
|
#Thu Aug 08 10:17:24 CEST 2024
|
||||||
wrapperUrl=https\://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
|
wrapperUrl=https\://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
|
||||||
distributionUrl=https\://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
|
distributionUrl=https\://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.8/apache-maven-3.9.8-bin.zip
|
||||||
|
2
Jenkinsfile
vendored
2
Jenkinsfile
vendored
@ -9,7 +9,7 @@ pipeline {
|
|||||||
|
|
||||||
triggers {
|
triggers {
|
||||||
pollSCM 'H/10 * * * *'
|
pollSCM 'H/10 * * * *'
|
||||||
upstream(upstreamProjects: "spring-data-commons/main", threshold: hudson.model.Result.SUCCESS)
|
upstream(upstreamProjects: "spring-data-commons/3.2.x", threshold: hudson.model.Result.SUCCESS)
|
||||||
}
|
}
|
||||||
|
|
||||||
options {
|
options {
|
||||||
|
11
README.adoc
11
README.adoc
@ -1,4 +1,6 @@
|
|||||||
= Spring Data for Elasticsearch image:https://jenkins.spring.io/buildStatus/icon?job=spring-data-elasticsearch%2Fmain&subject=Build[link=https://jenkins.spring.io/view/SpringData/job/spring-data-elasticsearch/] https://gitter.im/spring-projects/spring-data[image:https://badges.gitter.im/spring-projects/spring-data.svg[Gitter]] image:https://img.shields.io/badge/Revved%20up%20by-Develocity-06A0CE?logo=Gradle&labelColor=02303A["Revved up by Develocity", link="https://ge.spring.io/scans?search.rootProjectNames=Spring Data Elasticsearch"]
|
image:https://spring.io/badges/spring-data-elasticsearch/ga.svg[Spring Data Elasticsearch,link=https://projects.spring.io/spring-data-elasticsearch#quick-start] image:https://spring.io/badges/spring-data-elasticsearch/snapshot.svg[Spring Data Elasticsearch,link=https://projects.spring.io/spring-data-elasticsearch#quick-start]
|
||||||
|
|
||||||
|
= Spring Data for Elasticsearch image:https://jenkins.spring.io/buildStatus/icon?job=spring-data-elasticsearch%2Fmain&subject=Build[link=https://jenkins.spring.io/view/SpringData/job/spring-data-elasticsearch/] https://gitter.im/spring-projects/spring-data[image:https://badges.gitter.im/spring-projects/spring-data.svg[Gitter]] image:https://img.shields.io/badge/Revved%20up%20by-Gradle%20Enterprise-06A0CE?logo=Gradle&labelColor=02303A["Revved up by Gradle Enterprise", link="https://ge.spring.io/scans?search.rootProjectNames=Spring Data Elasticsearch"]
|
||||||
|
|
||||||
The primary goal of the https://projects.spring.io/spring-data[Spring Data] project is to make it easier to build Spring-powered applications that use new data access technologies such as non-relational databases, map-reduce frameworks, and cloud based data services.
|
The primary goal of the https://projects.spring.io/spring-data[Spring Data] project is to make it easier to build Spring-powered applications that use new data access technologies such as non-relational databases, map-reduce frameworks, and cloud based data services.
|
||||||
|
|
||||||
@ -62,7 +64,7 @@ public class MyService {
|
|||||||
|
|
||||||
=== Using the RestClient
|
=== Using the RestClient
|
||||||
|
|
||||||
Please check the https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.clients.configuration[official documentation].
|
Please check the [official documentation](https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.clients.configuration).
|
||||||
|
|
||||||
=== Maven configuration
|
=== Maven configuration
|
||||||
|
|
||||||
@ -124,7 +126,8 @@ We’d love to help!
|
|||||||
https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/[reference documentation], and https://docs.spring.io/spring-data/elasticsearch/docs/current/api/[Javadocs].
|
https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/[reference documentation], and https://docs.spring.io/spring-data/elasticsearch/docs/current/api/[Javadocs].
|
||||||
* Learn the Spring basics – Spring Data builds on Spring Framework, check the https://spring.io[spring.io] web-site for a wealth of reference documentation.
|
* Learn the Spring basics – Spring Data builds on Spring Framework, check the https://spring.io[spring.io] web-site for a wealth of reference documentation.
|
||||||
If you are just starting out with Spring, try one of the https://spring.io/guides[guides].
|
If you are just starting out with Spring, try one of the https://spring.io/guides[guides].
|
||||||
* Ask a question or chat with the community on https://app.gitter.im/#/room/#spring-projects_spring-data:gitter.im[Gitter].
|
* Ask a question - we monitor https://stackoverflow.com[stackoverflow.com] for questions tagged with https://stackoverflow.com/tags/spring-data[`spring-data-elasticsearch`].
|
||||||
|
You can also chat with the community on https://gitter.im/spring-projects/spring-data[Gitter].
|
||||||
* Report bugs with Spring Data for Elasticsearch at https://github.com/spring-projects/spring-data-elasticsearch/issues[https://github.com/spring-projects/spring-data-elasticsearch/issues].
|
* Report bugs with Spring Data for Elasticsearch at https://github.com/spring-projects/spring-data-elasticsearch/issues[https://github.com/spring-projects/spring-data-elasticsearch/issues].
|
||||||
|
|
||||||
== Reporting Issues
|
== Reporting Issues
|
||||||
@ -168,7 +171,7 @@ Building the documentation builds also the project without running tests.
|
|||||||
$ ./mvnw clean install -Pantora
|
$ ./mvnw clean install -Pantora
|
||||||
----
|
----
|
||||||
|
|
||||||
The generated documentation is available from `target/site/index.html`.
|
The generated documentation is available from `target/antora/site/index.html`.
|
||||||
|
|
||||||
== Examples
|
== Examples
|
||||||
|
|
||||||
|
@ -1,19 +1,22 @@
|
|||||||
# Java versions
|
# Java versions
|
||||||
java.main.tag=24.0.1_9-jdk-noble
|
java.main.tag=17.0.12_7-jdk-focal
|
||||||
java.next.tag=24.0.1_9-jdk-noble
|
java.next.tag=22.0.2_9-jdk-jammy
|
||||||
|
|
||||||
# Docker container images - standard
|
# Docker container images - standard
|
||||||
docker.java.main.image=library/eclipse-temurin:${java.main.tag}
|
docker.java.main.image=library/eclipse-temurin:${java.main.tag}
|
||||||
docker.java.next.image=library/eclipse-temurin:${java.next.tag}
|
docker.java.next.image=library/eclipse-temurin:${java.next.tag}
|
||||||
|
|
||||||
# Supported versions of MongoDB
|
# Supported versions of MongoDB
|
||||||
docker.mongodb.6.0.version=6.0.23
|
docker.mongodb.4.4.version=4.4.25
|
||||||
docker.mongodb.7.0.version=7.0.20
|
docker.mongodb.5.0.version=5.0.21
|
||||||
docker.mongodb.8.0.version=8.0.9
|
docker.mongodb.6.0.version=6.0.10
|
||||||
|
docker.mongodb.7.0.version=7.0.2
|
||||||
|
|
||||||
# Supported versions of Redis
|
# Supported versions of Redis
|
||||||
docker.redis.6.version=6.2.13
|
docker.redis.6.version=6.2.13
|
||||||
docker.redis.7.version=7.2.4
|
|
||||||
|
# Supported versions of Cassandra
|
||||||
|
docker.cassandra.3.version=3.11.16
|
||||||
|
|
||||||
# Docker environment settings
|
# Docker environment settings
|
||||||
docker.java.inside.basic=-v $HOME:/tmp/jenkins-home
|
docker.java.inside.basic=-v $HOME:/tmp/jenkins-home
|
||||||
|
55
pom.xml
55
pom.xml
@ -5,12 +5,12 @@
|
|||||||
|
|
||||||
<groupId>org.springframework.data</groupId>
|
<groupId>org.springframework.data</groupId>
|
||||||
<artifactId>spring-data-elasticsearch</artifactId>
|
<artifactId>spring-data-elasticsearch</artifactId>
|
||||||
<version>6.0.0-SNAPSHOT</version>
|
<version>5.2.11</version>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.data.build</groupId>
|
<groupId>org.springframework.data.build</groupId>
|
||||||
<artifactId>spring-data-parent</artifactId>
|
<artifactId>spring-data-parent</artifactId>
|
||||||
<version>4.0.0-SNAPSHOT</version>
|
<version>3.2.11</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<name>Spring Data Elasticsearch</name>
|
<name>Spring Data Elasticsearch</name>
|
||||||
@ -18,16 +18,16 @@
|
|||||||
<url>https://github.com/spring-projects/spring-data-elasticsearch</url>
|
<url>https://github.com/spring-projects/spring-data-elasticsearch</url>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<springdata.commons>4.0.0-SNAPSHOT</springdata.commons>
|
<springdata.commons>3.2.11</springdata.commons>
|
||||||
|
|
||||||
<!-- version of the ElasticsearchClient -->
|
<!-- version of the ElasticsearchClient -->
|
||||||
<elasticsearch-java>9.0.1</elasticsearch-java>
|
<elasticsearch-java>8.11.4</elasticsearch-java>
|
||||||
|
|
||||||
<hoverfly>0.19.0</hoverfly>
|
<hoverfly>0.14.4</hoverfly>
|
||||||
<log4j>2.23.1</log4j>
|
<log4j>2.18.0</log4j>
|
||||||
<jsonassert>1.5.3</jsonassert>
|
<jsonassert>1.5.1</jsonassert>
|
||||||
<testcontainers>1.20.0</testcontainers>
|
<testcontainers>1.18.0</testcontainers>
|
||||||
<wiremock>3.9.1</wiremock>
|
<wiremock>2.35.1</wiremock>
|
||||||
|
|
||||||
<java-module-name>spring.data.elasticsearch</java-module-name>
|
<java-module-name>spring.data.elasticsearch</java-module-name>
|
||||||
|
|
||||||
@ -131,10 +131,9 @@
|
|||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.elasticsearch.client</groupId>
|
<groupId>org.elasticsearch.client</groupId>
|
||||||
<artifactId>elasticsearch-rest-client</artifactId>
|
<artifactId>elasticsearch-rest-client</artifactId> <!-- is Apache 2-->
|
||||||
<version>${elasticsearch-java}</version>
|
<version>${elasticsearch-java}</version>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
@ -144,13 +143,6 @@
|
|||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.querydsl</groupId>
|
|
||||||
<artifactId>querydsl-core</artifactId>
|
|
||||||
<version>${querydsl}</version>
|
|
||||||
<optional>true</optional>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- Jackson JSON Mapper -->
|
<!-- Jackson JSON Mapper -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
@ -263,8 +255,8 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.wiremock</groupId>
|
<groupId>com.github.tomakehurst</groupId>
|
||||||
<artifactId>wiremock</artifactId>
|
<artifactId>wiremock-jre8</artifactId>
|
||||||
<version>${wiremock}</version>
|
<version>${wiremock}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
@ -324,13 +316,6 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.tngtech.archunit</groupId>
|
|
||||||
<artifactId>archunit-junit5</artifactId>
|
|
||||||
<version>${archunit}</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
@ -469,20 +454,8 @@
|
|||||||
</profiles>
|
</profiles>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
|
||||||
<id>spring-snapshot</id>
|
|
||||||
<url>https://repo.spring.io/snapshot</url>
|
|
||||||
<snapshots>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
</snapshots>
|
|
||||||
<releases>
|
|
||||||
<enabled>false</enabled>
|
|
||||||
</releases>
|
|
||||||
</repository>
|
|
||||||
<repository>
|
|
||||||
<id>spring-milestone</id>
|
|
||||||
<url>https://repo.spring.io/milestone</url>
|
|
||||||
</repository>
|
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -17,7 +17,7 @@ content:
|
|||||||
- url: https://github.com/spring-projects/spring-data-commons
|
- url: https://github.com/spring-projects/spring-data-commons
|
||||||
# Refname matching:
|
# Refname matching:
|
||||||
# https://docs.antora.org/antora/latest/playbook/content-refname-matching/
|
# https://docs.antora.org/antora/latest/playbook/content-refname-matching/
|
||||||
branches: [ main, 3.4.x, 3.3.x ]
|
branches: [ main, 3.2.x ]
|
||||||
start_path: src/main/antora
|
start_path: src/main/antora
|
||||||
asciidoc:
|
asciidoc:
|
||||||
attributes:
|
attributes:
|
||||||
|
@ -9,10 +9,6 @@
|
|||||||
*** xref:migration-guides/migration-guide-4.4-5.0.adoc[]
|
*** xref:migration-guides/migration-guide-4.4-5.0.adoc[]
|
||||||
*** xref:migration-guides/migration-guide-5.0-5.1.adoc[]
|
*** xref:migration-guides/migration-guide-5.0-5.1.adoc[]
|
||||||
*** xref:migration-guides/migration-guide-5.1-5.2.adoc[]
|
*** xref:migration-guides/migration-guide-5.1-5.2.adoc[]
|
||||||
*** xref:migration-guides/migration-guide-5.2-5.3.adoc[]
|
|
||||||
*** xref:migration-guides/migration-guide-5.3-5.4.adoc[]
|
|
||||||
*** xref:migration-guides/migration-guide-5.4-5.5.adoc[]
|
|
||||||
*** xref:migration-guides/migration-guide-5.5-6.0.adoc[]
|
|
||||||
|
|
||||||
|
|
||||||
* xref:elasticsearch.adoc[]
|
* xref:elasticsearch.adoc[]
|
||||||
|
@ -10,7 +10,7 @@ In order for the auditing code to be able to decide whether an entity instance i
|
|||||||
----
|
----
|
||||||
package org.springframework.data.domain;
|
package org.springframework.data.domain;
|
||||||
|
|
||||||
import org.jspecify.annotations.Nullable;
|
import org.springframework.lang.Nullable;
|
||||||
|
|
||||||
public interface Persistable<ID> {
|
public interface Persistable<ID> {
|
||||||
@Nullable
|
@Nullable
|
||||||
@ -81,5 +81,5 @@ class MyConfiguration {
|
|||||||
}
|
}
|
||||||
----
|
----
|
||||||
|
|
||||||
If your code contains more than one `AuditorAware` bean for different types, you must provide the name of the bean to use as an argument to the `auditorAwareRef` parameter of the
|
If your code contains more than one `AuditorAware` bean for different types, you must provide the name of the bean to use as an argument to the `auditorAwareRef` parameter of the
|
||||||
`@EnableElasticsearchAuditing` annotation.
|
`@EnableElasticsearchAuditing` annotation.
|
||||||
|
@ -150,7 +150,7 @@ ClientConfiguration clientConfiguration = ClientConfiguration.builder()
|
|||||||
return headers;
|
return headers;
|
||||||
})
|
})
|
||||||
.withClientConfigurer( <.>
|
.withClientConfigurer( <.>
|
||||||
ElasticsearchHttpClientConfigurationCallback.from(clientBuilder -> {
|
ElasticsearchClientConfigurationCallback.from(clientBuilder -> {
|
||||||
// ...
|
// ...
|
||||||
return clientBuilder;
|
return clientBuilder;
|
||||||
}))
|
}))
|
||||||
@ -192,7 +192,6 @@ This callback provides a `org.elasticsearch.client.RestClientBuilder` that can b
|
|||||||
[source,java]
|
[source,java]
|
||||||
----
|
----
|
||||||
ClientConfiguration.builder()
|
ClientConfiguration.builder()
|
||||||
.connectedTo("localhost:9200", "localhost:9291")
|
|
||||||
.withClientConfigurer(ElasticsearchClients.ElasticsearchRestClientConfigurationCallback.from(restClientBuilder -> {
|
.withClientConfigurer(ElasticsearchClients.ElasticsearchRestClientConfigurationCallback.from(restClientBuilder -> {
|
||||||
// configure the Elasticsearch RestClient
|
// configure the Elasticsearch RestClient
|
||||||
return restClientBuilder;
|
return restClientBuilder;
|
||||||
@ -211,7 +210,6 @@ used by the `RestClient`.
|
|||||||
[source,java]
|
[source,java]
|
||||||
----
|
----
|
||||||
ClientConfiguration.builder()
|
ClientConfiguration.builder()
|
||||||
.connectedTo("localhost:9200", "localhost:9291")
|
|
||||||
.withClientConfigurer(ElasticsearchClients.ElasticsearchHttpClientConfigurationCallback.from(httpAsyncClientBuilder -> {
|
.withClientConfigurer(ElasticsearchClients.ElasticsearchHttpClientConfigurationCallback.from(httpAsyncClientBuilder -> {
|
||||||
// configure the HttpAsyncClient
|
// configure the HttpAsyncClient
|
||||||
return httpAsyncClientBuilder;
|
return httpAsyncClientBuilder;
|
||||||
|
@ -1,39 +1,13 @@
|
|||||||
[[new-features]]
|
[[new-features]]
|
||||||
= What's new
|
= What's new
|
||||||
|
|
||||||
[[new-features.6-0-0]]
|
[[new-features.5-2-3]]
|
||||||
== New in Spring Data Elasticsearch 6.6
|
== New in Spring Data Elasticsearch 5.2.2
|
||||||
|
* Upgrade to Elasticsearch 8.11.4
|
||||||
|
|
||||||
* Upgarde to Spring 7
|
[[new-features.5-2-2]]
|
||||||
* Switch to jspecify nullability annotations
|
== New in Spring Data Elasticsearch 5.2.2
|
||||||
* Upgrade to Elasticsearch 9.0.1
|
* Upgrade to Elasticsearch 8.11.3
|
||||||
|
|
||||||
|
|
||||||
[[new-features.5-5-0]]
|
|
||||||
== New in Spring Data Elasticsearch 5.5
|
|
||||||
|
|
||||||
* Upgrade to Elasticsearch 8.18.1.
|
|
||||||
* Add support for the `@SearchTemplateQuery` annotation on repository methods.
|
|
||||||
* Scripted field properties of type collection can be populated from scripts returning arrays.
|
|
||||||
|
|
||||||
[[new-features.5-4-0]]
|
|
||||||
== New in Spring Data Elasticsearch 5.4
|
|
||||||
|
|
||||||
* Upgrade to Elasticsearch 8.15.3.
|
|
||||||
* Allow to customize the mapped type name for `@InnerField` and `@Field` annotations.
|
|
||||||
* Support for Elasticsearch SQL.
|
|
||||||
* Add support for retrieving request executionDuration.
|
|
||||||
|
|
||||||
[[new-features.5-3-0]]
|
|
||||||
== New in Spring Data Elasticsearch 5.3
|
|
||||||
|
|
||||||
* Upgrade to Elasticsearch 8.13.2.
|
|
||||||
* Add support for highlight queries in highlighting.
|
|
||||||
* Add shard statistics to the `SearchHit` class.
|
|
||||||
* Add support for multi search template API.
|
|
||||||
* Add support for SpEL in @Query.
|
|
||||||
* Add support for field aliases in the index mapping.
|
|
||||||
* Add support for has_child and has_parent queries.
|
|
||||||
|
|
||||||
[[new-features.5-2-0]]
|
[[new-features.5-2-0]]
|
||||||
== New in Spring Data Elasticsearch 5.2
|
== New in Spring Data Elasticsearch 5.2
|
||||||
|
@ -52,7 +52,7 @@ public class Statement {
|
|||||||
return routing;
|
return routing;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRouting(String routing) {
|
public void setRouting(Routing routing) {
|
||||||
this.routing = routing;
|
this.routing = routing;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,7 +199,7 @@ void init() {
|
|||||||
repository.save(
|
repository.save(
|
||||||
Statement.builder()
|
Statement.builder()
|
||||||
.withText("+1 for the sun")
|
.withText("+1 for the sun")
|
||||||
.withRouting(savedWeather.getId())
|
,withRouting(savedWeather.getId())
|
||||||
.withRelation(new JoinField<>("vote", sunnyAnswer.getId())) <5>
|
.withRelation(new JoinField<>("vote", sunnyAnswer.getId())) <5>
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
@ -226,7 +226,6 @@ SearchHits<Statement> hasVotes() {
|
|||||||
Query query = NativeQuery.builder()
|
Query query = NativeQuery.builder()
|
||||||
.withQuery(co.elastic.clients.elasticsearch._types.query_dsl.Query.of(qb -> qb
|
.withQuery(co.elastic.clients.elasticsearch._types.query_dsl.Query.of(qb -> qb
|
||||||
.hasChild(hc -> hc
|
.hasChild(hc -> hc
|
||||||
.type("answer")
|
|
||||||
.queryName("vote")
|
.queryName("vote")
|
||||||
.query(matchAllQueryAsQuery())
|
.query(matchAllQueryAsQuery())
|
||||||
.scoreMode(ChildScoreMode.None)
|
.scoreMode(ChildScoreMode.None)
|
||||||
|
@ -365,8 +365,6 @@ operations.putScript( <.>
|
|||||||
|
|
||||||
To use a search template in a search query, Spring Data Elasticsearch provides the `SearchTemplateQuery`, an implementation of the `org.springframework.data.elasticsearch.core.query.Query` interface.
|
To use a search template in a search query, Spring Data Elasticsearch provides the `SearchTemplateQuery`, an implementation of the `org.springframework.data.elasticsearch.core.query.Query` interface.
|
||||||
|
|
||||||
NOTE: Although `SearchTemplateQuery` is an implementation of the `Query` interface, not all of the functionality provided by the base class is available for a `SearchTemplateQuery` like setting a `Pageable` or a `Sort`. Values for this functionality must be added to the stored script like shown in the following example for paging parameters. If these values are set on the `Query` object, they will be ignored.
|
|
||||||
|
|
||||||
In the following code, we will add a call using a search template query to a custom repository implementation (see
|
In the following code, we will add a call using a search template query to a custom repository implementation (see
|
||||||
xref:repositories/custom-implementations.adoc[]) as an example how this can be integrated into a repository call.
|
xref:repositories/custom-implementations.adoc[]) as an example how this can be integrated into a repository call.
|
||||||
|
|
||||||
@ -451,3 +449,4 @@ var query = Query.findAll().addSort(Sort.by(order));
|
|||||||
About the filter query: It is not possible to use a `CriteriaQuery` here, as this query would be converted into a Elasticsearch nested query which does not work in the filter context. So only `StringQuery` or `NativeQuery` can be used here. When using one of these, like the term query above, the Elasticsearch field names must be used, so take care, when these are redefined with the `@Field(name="...")` definition.
|
About the filter query: It is not possible to use a `CriteriaQuery` here, as this query would be converted into a Elasticsearch nested query which does not work in the filter context. So only `StringQuery` or `NativeQuery` can be used here. When using one of these, like the term query above, the Elasticsearch field names must be used, so take care, when these are redefined with the `@Field(name="...")` definition.
|
||||||
|
|
||||||
For the definition of the order path and the nested paths, the Java entity property names should be used.
|
For the definition of the order path and the nested paths, the Java entity property names should be used.
|
||||||
|
|
||||||
|
@ -192,7 +192,8 @@ public String getProperty() {
|
|||||||
|
|
||||||
This annotation can be set on a String property of an entity.
|
This annotation can be set on a String property of an entity.
|
||||||
This property will not be written to the mapping, it will not be stored in Elasticsearch and its value will not be read from an Elasticsearch document.
|
This property will not be written to the mapping, it will not be stored in Elasticsearch and its value will not be read from an Elasticsearch document.
|
||||||
After an entity is persisted, for example with a call to `ElasticsearchOperations.save(T entity)`, the entity returned from that call will contain the name of the index that an entity was saved to in that property.
|
After an entity is persisted, for example with a call to `ElasticsearchOperations.save(T entity)`, the entity
|
||||||
|
returned from that call will contain the name of the index that an entity was saved to in that property.
|
||||||
This is useful when the index name is dynamically set by a bean, or when writing to a write alias.
|
This is useful when the index name is dynamically set by a bean, or when writing to a write alias.
|
||||||
|
|
||||||
Putting some value into such a property does not set the index into which an entity is stored!
|
Putting some value into such a property does not set the index into which an entity is stored!
|
||||||
@ -422,6 +423,7 @@ Looking at the `Configuration` from the xref:elasticsearch/object-mapping.adoc#e
|
|||||||
@Configuration
|
@Configuration
|
||||||
public class Config extends ElasticsearchConfiguration {
|
public class Config extends ElasticsearchConfiguration {
|
||||||
|
|
||||||
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public ClientConfiguration clientConfiguration() {
|
public ClientConfiguration clientConfiguration() {
|
||||||
return ClientConfiguration.builder() //
|
return ClientConfiguration.builder() //
|
||||||
|
@ -12,10 +12,10 @@ class Book {
|
|||||||
@Id
|
@Id
|
||||||
private String id;
|
private String id;
|
||||||
|
|
||||||
@Field(type = FieldType.Text)
|
@Field(type = FieldType.text)
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@Field(type = FieldType.Text)
|
@Field(type = FieldType.text)
|
||||||
private String summary;
|
private String summary;
|
||||||
|
|
||||||
@Field(type = FieldType.Integer)
|
@Field(type = FieldType.Integer)
|
||||||
|
@ -10,9 +10,7 @@ The Elasticsearch module supports all basic query building feature as string que
|
|||||||
=== Declared queries
|
=== Declared queries
|
||||||
|
|
||||||
Deriving the query from the method name is not always sufficient and/or may result in unreadable method names.
|
Deriving the query from the method name is not always sufficient and/or may result in unreadable method names.
|
||||||
In this case one might make use of the `@Query` annotation (see xref:elasticsearch/repositories/elasticsearch-repository-queries.adoc#elasticsearch.query-methods.at-query[Using the @Query Annotation] ).
|
In this case one might make use of the `@Query` annotation (see xref:elasticsearch/repositories/elasticsearch-repository-queries.adoc#elasticsearch.query-methods.at-query[Using @Query Annotation] ).
|
||||||
|
|
||||||
Another possibility is the use of a search-template, (see xref:elasticsearch/repositories/elasticsearch-repository-queries.adoc#elasticsearch.query-methods.at-searchtemplate-query[Using the @SearchTemplateQuery Annotation] ).
|
|
||||||
|
|
||||||
[[elasticsearch.query-methods.criterions]]
|
[[elasticsearch.query-methods.criterions]]
|
||||||
== Query creation
|
== Query creation
|
||||||
@ -314,13 +312,11 @@ Repository methods can be defined to have the following return types for returni
|
|||||||
* `SearchPage<T>`
|
* `SearchPage<T>`
|
||||||
|
|
||||||
[[elasticsearch.query-methods.at-query]]
|
[[elasticsearch.query-methods.at-query]]
|
||||||
== Using the @Query Annotation
|
== Using @Query Annotation
|
||||||
|
|
||||||
.Declare query on the method using the `@Query` annotation.
|
.Declare query on the method using the `@Query` annotation.
|
||||||
====
|
====
|
||||||
The arguments passed to the method can be inserted into placeholders in the query string.
|
The arguments passed to the method can be inserted into placeholders in the query string. the placeholders are of the form `?0`, `?1`, `?2` etc. for the first, second, third parameter and so on.
|
||||||
The placeholders are of the form `?0`, `?1`, `?2` etc. for the first, second, third parameter and so on.
|
|
||||||
|
|
||||||
[source,java]
|
[source,java]
|
||||||
----
|
----
|
||||||
interface BookRepository extends ElasticsearchRepository<Book, String> {
|
interface BookRepository extends ElasticsearchRepository<Book, String> {
|
||||||
@ -345,20 +341,15 @@ It will be sent to Easticsearch as value of the query element; if for example th
|
|||||||
}
|
}
|
||||||
----
|
----
|
||||||
====
|
====
|
||||||
|
|
||||||
.`@Query` annotation on a method taking a Collection argument
|
.`@Query` annotation on a method taking a Collection argument
|
||||||
====
|
====
|
||||||
A repository method such as
|
A repository method such as
|
||||||
|
|
||||||
[source,java]
|
[source,java]
|
||||||
----
|
----
|
||||||
@Query("{\"ids\": {\"values\": ?0 }}")
|
@Query("{\"ids\": {\"values\": ?0 }}")
|
||||||
List<SampleEntity> getByIds(Collection<String> ids);
|
List<SampleEntity> getByIds(Collection<String> ids);
|
||||||
----
|
----
|
||||||
|
would make an https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-ids-query.html[IDs query] to return all the matching documents. So calling the method with a `List` of `["id1", "id2", "id3"]` would produce the query body
|
||||||
would make an https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-ids-query.html[IDs query] to return all the matching documents.
|
|
||||||
So calling the method with a `List` of `["id1", "id2", "id3"]` would produce the query body
|
|
||||||
|
|
||||||
[source,json]
|
[source,json]
|
||||||
----
|
----
|
||||||
{
|
{
|
||||||
@ -370,223 +361,3 @@ So calling the method with a `List` of `["id1", "id2", "id3"]` would produce the
|
|||||||
}
|
}
|
||||||
----
|
----
|
||||||
====
|
====
|
||||||
|
|
||||||
[[elasticsearch.query-methods.at-query.spel]]
|
|
||||||
=== Using SpEL Expressions
|
|
||||||
|
|
||||||
.Declare query on the method using the `@Query` annotation with SpEL expression.
|
|
||||||
====
|
|
||||||
https://docs.spring.io/spring-framework/reference/core/expressions.html[SpEL expression] is also supported when defining query in `@Query`.
|
|
||||||
|
|
||||||
[source,java]
|
|
||||||
----
|
|
||||||
interface BookRepository extends ElasticsearchRepository<Book, String> {
|
|
||||||
@Query("""
|
|
||||||
{
|
|
||||||
"bool":{
|
|
||||||
"must":[
|
|
||||||
{
|
|
||||||
"term":{
|
|
||||||
"name": "#{#name}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
""")
|
|
||||||
Page<Book> findByName(String name, Pageable pageable);
|
|
||||||
}
|
|
||||||
----
|
|
||||||
|
|
||||||
If for example the function is called with the parameter _John_, it would produce the following query body:
|
|
||||||
|
|
||||||
[source,json]
|
|
||||||
----
|
|
||||||
{
|
|
||||||
"bool":{
|
|
||||||
"must":[
|
|
||||||
{
|
|
||||||
"term":{
|
|
||||||
"name": "John"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
----
|
|
||||||
====
|
|
||||||
|
|
||||||
.accessing parameter property.
|
|
||||||
====
|
|
||||||
Supposing that we have the following class as query parameter type:
|
|
||||||
|
|
||||||
[source,java]
|
|
||||||
----
|
|
||||||
public record QueryParameter(String value) {
|
|
||||||
}
|
|
||||||
----
|
|
||||||
|
|
||||||
It's easy to access the parameter by `#` symbol, then reference the property `value` with a simple `.`:
|
|
||||||
|
|
||||||
[source,java]
|
|
||||||
----
|
|
||||||
interface BookRepository extends ElasticsearchRepository<Book, String> {
|
|
||||||
@Query("""
|
|
||||||
{
|
|
||||||
"bool":{
|
|
||||||
"must":[
|
|
||||||
{
|
|
||||||
"term":{
|
|
||||||
"name": "#{#parameter.value}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
""")
|
|
||||||
Page<Book> findByName(QueryParameter parameter, Pageable pageable);
|
|
||||||
}
|
|
||||||
----
|
|
||||||
|
|
||||||
We can pass `new QueryParameter("John")` as the parameter now, and it will produce the same query string as above.
|
|
||||||
====
|
|
||||||
|
|
||||||
.accessing bean property.
|
|
||||||
====
|
|
||||||
https://docs.spring.io/spring-framework/reference/core/expressions/language-ref/bean-references.html[Bean property] is also supported to access.
|
|
||||||
Given that there is a bean named `queryParameter` of type `QueryParameter`, we can access the bean with symbol `@` rather than `#`, and there is no need to declare a parameter of type `QueryParameter` in the query method:
|
|
||||||
|
|
||||||
[source,java]
|
|
||||||
----
|
|
||||||
interface BookRepository extends ElasticsearchRepository<Book, String> {
|
|
||||||
@Query("""
|
|
||||||
{
|
|
||||||
"bool":{
|
|
||||||
"must":[
|
|
||||||
{
|
|
||||||
"term":{
|
|
||||||
"name": "#{@queryParameter.value}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
""")
|
|
||||||
Page<Book> findByName(Pageable pageable);
|
|
||||||
}
|
|
||||||
----
|
|
||||||
====
|
|
||||||
|
|
||||||
.SpEL and `Collection` param.
|
|
||||||
====
|
|
||||||
`Collection` parameter is also supported and is as easy to use as normal `String`, such as the following `terms` query:
|
|
||||||
|
|
||||||
[source,java]
|
|
||||||
----
|
|
||||||
interface BookRepository extends ElasticsearchRepository<Book, String> {
|
|
||||||
@Query("""
|
|
||||||
{
|
|
||||||
"bool":{
|
|
||||||
"must":[
|
|
||||||
{
|
|
||||||
"terms":{
|
|
||||||
"name": #{#names}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
""")
|
|
||||||
Page<Book> findByName(Collection<String> names, Pageable pageable);
|
|
||||||
}
|
|
||||||
----
|
|
||||||
|
|
||||||
NOTE: collection values should not be quoted when declaring the elasticsearch json query.
|
|
||||||
|
|
||||||
A collection of `names` like `List.of("name1", "name2")` will produce the following terms query:
|
|
||||||
|
|
||||||
[source,json]
|
|
||||||
----
|
|
||||||
{
|
|
||||||
"bool":{
|
|
||||||
"must":[
|
|
||||||
{
|
|
||||||
"terms":{
|
|
||||||
"name": ["name1", "name2"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
----
|
|
||||||
====
|
|
||||||
|
|
||||||
.access property in the `Collection` param.
|
|
||||||
====
|
|
||||||
https://docs.spring.io/spring-framework/reference/core/expressions/language-ref/collection-projection.html[SpEL Collection Projection] is convenient to use when values in the `Collection` parameter is not plain `String`:
|
|
||||||
|
|
||||||
[source,java]
|
|
||||||
----
|
|
||||||
interface BookRepository extends ElasticsearchRepository<Book, String> {
|
|
||||||
@Query("""
|
|
||||||
{
|
|
||||||
"bool":{
|
|
||||||
"must":[
|
|
||||||
{
|
|
||||||
"terms":{
|
|
||||||
"name": #{#parameters.![value]}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
""")
|
|
||||||
Page<Book> findByName(Collection<QueryParameter> parameters, Pageable pageable);
|
|
||||||
}
|
|
||||||
----
|
|
||||||
|
|
||||||
This will extract all the `value` property values as a new `Collection` from `QueryParameter` collection, thus takes the same effect as above.
|
|
||||||
====
|
|
||||||
|
|
||||||
.alter parameter name by using `@Param`
|
|
||||||
====
|
|
||||||
When accessing the parameter by SpEL, it's also useful to alter the parameter name to another one by `@Param` annotation in Sping Data:
|
|
||||||
|
|
||||||
[source,java]
|
|
||||||
----
|
|
||||||
interface BookRepository extends ElasticsearchRepository<Book, String> {
|
|
||||||
@Query("""
|
|
||||||
{
|
|
||||||
"bool":{
|
|
||||||
"must":[
|
|
||||||
{
|
|
||||||
"terms":{
|
|
||||||
"name": #{#another.![value]}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
""")
|
|
||||||
Page<Book> findByName(@Param("another") Collection<QueryParameter> parameters, Pageable pageable);
|
|
||||||
}
|
|
||||||
----
|
|
||||||
|
|
||||||
====
|
|
||||||
|
|
||||||
[[elasticsearch.query-methods.at-searchtemplate-query]]
|
|
||||||
== Using the @SearchTemplateQuery Annotation
|
|
||||||
|
|
||||||
When using Elasticsearch search templates - (see xref:elasticsearch/misc.adoc#elasticsearch.misc.searchtemplates [Search Template support]) it is possible to specify that a repository method should use a template by adding the `@SearchTemplateQuery` annotation to that method.
|
|
||||||
|
|
||||||
Let's assume that there is a search template stored with the name "book-by-title" and this template need a parameter named "title", then a repository method using that search template can be defined like this:
|
|
||||||
|
|
||||||
[source,java]
|
|
||||||
----
|
|
||||||
interface BookRepository extends ElasticsearchRepository<Book, String> {
|
|
||||||
@SearchTemplateQuery(id = "book-by-title")
|
|
||||||
SearchHits<Book> findByTitle(String title);
|
|
||||||
}
|
|
||||||
----
|
|
||||||
|
|
||||||
The parameters of the repository method are sent to the seacrh template as key/value pairs where the key is the parameter name and the value is taken from the actual value when the method is invoked.
|
|
||||||
|
@ -20,12 +20,12 @@ Whereas the birthdate is fix, the age depends on the time when a query is issued
|
|||||||
====
|
====
|
||||||
[source,java]
|
[source,java]
|
||||||
----
|
----
|
||||||
import org.jspecify.annotations.Nullable;
|
|
||||||
import org.springframework.data.annotation.Id;
|
import org.springframework.data.annotation.Id;
|
||||||
import org.springframework.data.elasticsearch.annotations.DateFormat;
|
import org.springframework.data.elasticsearch.annotations.DateFormat;
|
||||||
import org.springframework.data.elasticsearch.annotations.Document;
|
import org.springframework.data.elasticsearch.annotations.Document;
|
||||||
import org.springframework.data.elasticsearch.annotations.Field;
|
import org.springframework.data.elasticsearch.annotations.Field;
|
||||||
import org.springframework.data.elasticsearch.annotations.ScriptedField;
|
import org.springframework.data.elasticsearch.annotations.ScriptedField;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
@ -194,7 +194,7 @@ In the following code this is used to run a query for a given gender and maximum
|
|||||||
|
|
||||||
var runtimeField = new RuntimeField("age", "long", """ <.>
|
var runtimeField = new RuntimeField("age", "long", """ <.>
|
||||||
Instant currentDate = Instant.ofEpochMilli(new Date().getTime());
|
Instant currentDate = Instant.ofEpochMilli(new Date().getTime());
|
||||||
Instant startDate = doc['birthDate'].value.toInstant();
|
Instant startDate = doc['birth-date'].value.toInstant();
|
||||||
emit (ChronoUnit.DAYS.between(startDate, currentDate) / 365);
|
emit (ChronoUnit.DAYS.between(startDate, currentDate) / 365);
|
||||||
""");
|
""");
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ When a document is retrieved with the methods of the `DocumentOperations` inter
|
|||||||
When searching with the methods of the `SearchOperations` interface, additional information is available for each entity, for example the _score_ or the _sortValues_ of the found entity.
|
When searching with the methods of the `SearchOperations` interface, additional information is available for each entity, for example the _score_ or the _sortValues_ of the found entity.
|
||||||
|
|
||||||
In order to return this information, each entity is wrapped in a `SearchHit` object that contains this entity-specific additional information.
|
In order to return this information, each entity is wrapped in a `SearchHit` object that contains this entity-specific additional information.
|
||||||
These `SearchHit` objects themselves are returned within a `SearchHits` object which additionally contains informations about the whole search like the _maxScore_ or requested aggregations or the execution duration it took to complete the request.
|
These `SearchHit` objects themselves are returned within a `SearchHits` object which additionally contains informations about the whole search like the _maxScore_ or requested aggregations.
|
||||||
The following classes and interfaces are now available:
|
The following classes and interfaces are now available:
|
||||||
|
|
||||||
.SearchHit<T>
|
.SearchHit<T>
|
||||||
|
@ -6,13 +6,9 @@ The following table shows the Elasticsearch and Spring versions that are used by
|
|||||||
[cols="^,^,^,^",options="header"]
|
[cols="^,^,^,^",options="header"]
|
||||||
|===
|
|===
|
||||||
| Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Framework
|
| Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Framework
|
||||||
| 2025.1 (in development) | 6.0.x | 9.0.1 | 7.0.x
|
| 2023.1 (Vaughan) | 5.2.x | 8.11.4 | 6.1.x
|
||||||
| 2025.0 | 5.5.x | 8.18.1 | 6.2.x
|
| 2023.0 (Ullmann) | 5.1.x | 8.7.1 | 6.0.x
|
||||||
| 2024.1 | 5.4.x | 8.15.5 | 6.1.x
|
| 2022.0 (Turing) | 5.0.xfootnote:oom[Out of maintenance] | 8.5.3 | 6.0.x
|
||||||
| 2024.0 | 5.3.xfootnote:oom[Out of maintenance] | 8.13.4 | 6.1.x
|
|
||||||
| 2023.1 (Vaughan) | 5.2.xfootnote:oom[] | 8.11.1 | 6.1.x
|
|
||||||
| 2023.0 (Ullmann) | 5.1.xfootnote:oom[] | 8.7.1 | 6.0.x
|
|
||||||
| 2022.0 (Turing) | 5.0.xfootnote:oom[] | 8.5.3 | 6.0.x
|
|
||||||
| 2021.2 (Raj) | 4.4.xfootnote:oom[] | 7.17.3 | 5.3.x
|
| 2021.2 (Raj) | 4.4.xfootnote:oom[] | 7.17.3 | 5.3.x
|
||||||
| 2021.1 (Q) | 4.3.xfootnote:oom[] | 7.15.2 | 5.3.x
|
| 2021.1 (Q) | 4.3.xfootnote:oom[] | 7.15.2 | 5.3.x
|
||||||
| 2021.0 (Pascal) | 4.2.xfootnote:oom[] | 7.12.0 | 5.3.x
|
| 2021.0 (Pascal) | 4.2.xfootnote:oom[] | 7.12.0 | 5.3.x
|
||||||
|
@ -49,7 +49,7 @@ Also the reactive implementation that was provided up to now has been moved here
|
|||||||
If you are using `ElasticsearchRestTemplate` directly and not the `ElasticsearchOperations` interface you'll need to adjust your imports as well.
|
If you are using `ElasticsearchRestTemplate` directly and not the `ElasticsearchOperations` interface you'll need to adjust your imports as well.
|
||||||
|
|
||||||
When working with the `NativeSearchQuery` class, you'll need to switch to the `NativeQuery` class, which can take a
|
When working with the `NativeSearchQuery` class, you'll need to switch to the `NativeQuery` class, which can take a
|
||||||
`Query` instance coming from the new Elasticsearch client libraries.
|
`Query` instance comign from the new Elasticsearch client libraries.
|
||||||
You'll find plenty of examples in the test code.
|
You'll find plenty of examples in the test code.
|
||||||
|
|
||||||
[[elasticsearch-migration-guide-4.4-5.0.breaking-changes-records]]
|
[[elasticsearch-migration-guide-4.4-5.0.breaking-changes-records]]
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
[[elasticsearch-migration-guide-5.2-5.3]]
|
|
||||||
= Upgrading from 5.2.x to 5.3.x
|
|
||||||
|
|
||||||
This section describes breaking changes from version 5.2.x to 5.3.x and how removed features can be replaced by new introduced features.
|
|
||||||
|
|
||||||
[[elasticsearch-migration-guide-5.2-5.3.breaking-changes]]
|
|
||||||
== Breaking Changes
|
|
||||||
|
|
||||||
During the parameter replacement in `@Query` annotated repository methods previous versions wrote the String `"null"` into the query that was sent to Elasticsearch when the actual parameter value was `null`.
|
|
||||||
As Elasticsearch does not store `null` values, this behaviour could lead to problems, for example whent the fields to be searched contains the string `"null"`.
|
|
||||||
In Version 5.3 a `null` value in a parameter will cause a `ConversionException` to be thrown.
|
|
||||||
If you are using `"null"` as the
|
|
||||||
`null_value` defined in a field mapping, then pass that string into the query instead of a Java `null`.
|
|
||||||
|
|
||||||
[[elasticsearch-migration-guide-5.2-5.3.deprecations]]
|
|
||||||
== Deprecations
|
|
||||||
|
|
||||||
=== Removals
|
|
||||||
|
|
||||||
The deprecated classes `org.springframework.data.elasticsearch.ELCQueries`
|
|
||||||
and `org.springframework.data.elasticsearch.client.elc.QueryBuilders` have been removed, use `org.springframework.data.elasticsearch.client.elc.Queries` instead.
|
|
@ -1,23 +0,0 @@
|
|||||||
[[elasticsearch-migration-guide-5.3-5.4]]
|
|
||||||
= Upgrading from 5.3.x to 5.4.x
|
|
||||||
|
|
||||||
This section describes breaking changes from version 5.3.x to 5.4.x and how removed features can be replaced by new introduced features.
|
|
||||||
|
|
||||||
[[elasticsearch-migration-guide-5.3-5.4.breaking-changes]]
|
|
||||||
== Breaking Changes
|
|
||||||
|
|
||||||
[[elasticsearch-migration-guide-5.3-5.4.breaking-changes.knn-search]]
|
|
||||||
=== knn search
|
|
||||||
The `withKnnQuery` method in `NativeQueryBuilder` has been replaced with `withKnnSearches` to build a `NativeQuery` with knn search.
|
|
||||||
|
|
||||||
`KnnQuery` and `KnnSearch` are two different classes in elasticsearch java client and are used for different queries, with different parameters supported:
|
|
||||||
|
|
||||||
- `KnnSearch`: is https://www.elastic.co/guide/en/elasticsearch/reference/8.13/search-search.html#search-api-knn[the top level `knn` query] in the elasticsearch request;
|
|
||||||
- `KnnQuery`: is https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-knn-query.html[the `knn` query inside `query` clause];
|
|
||||||
|
|
||||||
If `KnnQuery` is still preferable, please be sure to construct it inside `query` clause manually, by means of `withQuery(co.elastic.clients.elasticsearch._types.query_dsl.Query query)` clause in `NativeQueryBuilder`.
|
|
||||||
|
|
||||||
[[elasticsearch-migration-guide-5.3-5.4.deprecations]]
|
|
||||||
== Deprecations
|
|
||||||
|
|
||||||
=== Removals
|
|
@ -1,30 +0,0 @@
|
|||||||
[[elasticsearch-migration-guide-5.4-5.5]]
|
|
||||||
= Upgrading from 5.4.x to 5.5.x
|
|
||||||
|
|
||||||
This section describes breaking changes from version 5.4.x to 5.5.x and how removed features can be replaced by new introduced features.
|
|
||||||
|
|
||||||
[[elasticsearch-migration-guide-5.4-5.5.breaking-changes]]
|
|
||||||
== Breaking Changes
|
|
||||||
|
|
||||||
[[elasticsearch-migration-guide-5.4-5.5.deprecations]]
|
|
||||||
== Deprecations
|
|
||||||
|
|
||||||
Some classes that probably are not used by a library user have been renamed, the classes with the old names are still there, but are deprecated:
|
|
||||||
|
|
||||||
|===
|
|
||||||
|old name|new name
|
|
||||||
|
|
||||||
|ElasticsearchPartQuery|RepositoryPartQuery
|
|
||||||
|ElasticsearchStringQuery|RepositoryStringQuery
|
|
||||||
|ReactiveElasticsearchStringQuery|ReactiveRepositoryStringQuery
|
|
||||||
|===
|
|
||||||
|
|
||||||
=== Removals
|
|
||||||
|
|
||||||
The following methods that had been deprecated since release 5.3 have been removed:
|
|
||||||
```
|
|
||||||
DocumentOperations.delete(Query, Class<?>)
|
|
||||||
DocumentOperations.delete(Query, Class<?>, IndexCoordinates)
|
|
||||||
ReactiveDocumentOperations.delete(Query, Class<?>)
|
|
||||||
ReactiveDocumentOperations.delete(Query, Class<?>, IndexCoordinates)
|
|
||||||
```
|
|
@ -1,21 +0,0 @@
|
|||||||
[[elasticsearch-migration-guide-5.5-6.0]]
|
|
||||||
= Upgrading from 5.5.x to 6.0.x
|
|
||||||
|
|
||||||
This section describes breaking changes from version 5.5.x to 6.0.x and how removed features can be replaced by new introduced features.
|
|
||||||
|
|
||||||
[[elasticsearch-migration-guide-5.5-6.0.breaking-changes]]
|
|
||||||
== Breaking Changes
|
|
||||||
|
|
||||||
[[elasticsearch-migration-guide-5.5-6.0.deprecations]]
|
|
||||||
== Deprecations
|
|
||||||
|
|
||||||
|
|
||||||
=== Removals
|
|
||||||
|
|
||||||
The `org.springframework.data.elasticsearch.core.query.ScriptType` enum has been removed. To distinguish between an inline and a stored script set the appropriate values in the `org.springframework.data.elasticsearch.core.query.ScriptData` record.
|
|
||||||
|
|
||||||
These methods have been removed because the Elasticsearch Client 9 does not support them anymore:
|
|
||||||
```
|
|
||||||
org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchIndicesClient.unfreeze(UnfreezeRequest)
|
|
||||||
org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchIndicesClient.unfreeze(Function<UnfreezeRequest.Builder, ObjectBuilder<UnfreezeRequest>>)
|
|
||||||
```
|
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2020-2025 the original author or authors.
|
* Copyright 2020-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2022-2025 the original author or authors.
|
* Copyright 2022-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -15,9 +15,9 @@
|
|||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch;
|
package org.springframework.data.elasticsearch;
|
||||||
|
|
||||||
import java.util.List;
|
import org.springframework.lang.Nullable;
|
||||||
|
|
||||||
import org.jspecify.annotations.Nullable;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Object describing an Elasticsearch error
|
* Object describing an Elasticsearch error
|
||||||
@ -26,7 +26,8 @@ import org.jspecify.annotations.Nullable;
|
|||||||
* @since 4.4
|
* @since 4.4
|
||||||
*/
|
*/
|
||||||
public class ElasticsearchErrorCause {
|
public class ElasticsearchErrorCause {
|
||||||
@Nullable private final String type;
|
@Nullable
|
||||||
|
private final String type;
|
||||||
|
|
||||||
private final String reason;
|
private final String reason;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2019-2025 the original author or authors.
|
* Copyright 2019-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2022-2025 the original author or authors.
|
* Copyright 2022-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2020-2025 the original author or authors.
|
* Copyright 2020-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -15,8 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch;
|
package org.springframework.data.elasticsearch;
|
||||||
|
|
||||||
import org.jspecify.annotations.Nullable;
|
|
||||||
import org.springframework.dao.UncategorizedDataAccessException;
|
import org.springframework.dao.UncategorizedDataAccessException;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Peter-Josef Meisch
|
* @author Peter-Josef Meisch
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2023-2025 the original author or authors.
|
* Copyright 2023-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,79 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2024-2025 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.springframework.data.elasticsearch.annotations;
|
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Inherited;
|
|
||||||
import java.lang.annotation.Repeatable;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
|
|
||||||
import org.springframework.core.annotation.AliasFor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Identifies an alias for the index.
|
|
||||||
*
|
|
||||||
* @author Youssef Aouichaoui
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
@Inherited
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
@Target({ ElementType.TYPE })
|
|
||||||
@Repeatable(Aliases.class)
|
|
||||||
public @interface Alias {
|
|
||||||
/**
|
|
||||||
* @return Index alias name. Alias for {@link #alias}.
|
|
||||||
*/
|
|
||||||
@AliasFor("alias")
|
|
||||||
String value() default "";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Index alias name. Alias for {@link #value}.
|
|
||||||
*/
|
|
||||||
@AliasFor("value")
|
|
||||||
String alias() default "";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Query used to limit documents the alias can access.
|
|
||||||
*/
|
|
||||||
Filter filter() default @Filter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Used to route indexing operations to a specific shard.
|
|
||||||
*/
|
|
||||||
String indexRouting() default "";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Used to route indexing and search operations to a specific shard.
|
|
||||||
*/
|
|
||||||
String routing() default "";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Used to route search operations to a specific shard.
|
|
||||||
*/
|
|
||||||
String searchRouting() default "";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Is the alias hidden?
|
|
||||||
*/
|
|
||||||
boolean isHidden() default false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Is it the 'write index' for the alias?
|
|
||||||
*/
|
|
||||||
boolean isWriteIndex() default false;
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2024-2025 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.springframework.data.elasticsearch.annotations;
|
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Inherited;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Container annotation that aggregates several {@link Alias} annotations.
|
|
||||||
*
|
|
||||||
* @author Youssef Aouichaoui
|
|
||||||
* @see Alias
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
@Inherited
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
@Target({ ElementType.TYPE })
|
|
||||||
public @interface Aliases {
|
|
||||||
Alias[] value();
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2019-2025 the original author or authors.
|
* Copyright 2019-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2025 the original author or authors.
|
* Copyright 2013-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014-2025 the original author or authors.
|
* Copyright 2014-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -39,173 +39,41 @@ public enum DateFormat {
|
|||||||
basic_t_time("'T'HHmmss.SSSXXX"), //
|
basic_t_time("'T'HHmmss.SSSXXX"), //
|
||||||
basic_t_time_no_millis("'T'HHmmssXXX"), //
|
basic_t_time_no_millis("'T'HHmmssXXX"), //
|
||||||
basic_week_date("YYYY'W'wwe"), // week-based-year!
|
basic_week_date("YYYY'W'wwe"), // week-based-year!
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_basic_week_date("YYYY'W'wwe"), // week-based-year!
|
|
||||||
basic_week_date_time("YYYY'W'wwe'T'HHmmss.SSSX"), // here Elasticsearch uses a different zone format
|
basic_week_date_time("YYYY'W'wwe'T'HHmmss.SSSX"), // here Elasticsearch uses a different zone format
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_basic_week_date_time("YYYY'W'wwe'T'HHmmss.SSSX"), // here Elasticsearch uses a different zone format
|
|
||||||
basic_week_date_time_no_millis("YYYY'W'wwe'T'HHmmssX"), //
|
basic_week_date_time_no_millis("YYYY'W'wwe'T'HHmmssX"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_basic_week_date_time_no_millis("YYYY'W'wwe'T'HHmmssX"), //
|
|
||||||
date("uuuu-MM-dd"), //
|
date("uuuu-MM-dd"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_date("uuuu-MM-dd"), //
|
|
||||||
date_hour("uuuu-MM-dd'T'HH"), //
|
date_hour("uuuu-MM-dd'T'HH"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_date_hour("uuuu-MM-dd'T'HH"), //
|
|
||||||
date_hour_minute("uuuu-MM-dd'T'HH:mm"), //
|
date_hour_minute("uuuu-MM-dd'T'HH:mm"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_date_hour_minute("uuuu-MM-dd'T'HH:mm"), //
|
|
||||||
date_hour_minute_second("uuuu-MM-dd'T'HH:mm:ss"), //
|
date_hour_minute_second("uuuu-MM-dd'T'HH:mm:ss"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_date_hour_minute_second("uuuu-MM-dd'T'HH:mm:ss"), //
|
|
||||||
date_hour_minute_second_fraction("uuuu-MM-dd'T'HH:mm:ss.SSS"), //
|
date_hour_minute_second_fraction("uuuu-MM-dd'T'HH:mm:ss.SSS"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_date_hour_minute_second_fraction("uuuu-MM-dd'T'HH:mm:ss.SSS"), //
|
|
||||||
date_hour_minute_second_millis("uuuu-MM-dd'T'HH:mm:ss.SSS"), //
|
date_hour_minute_second_millis("uuuu-MM-dd'T'HH:mm:ss.SSS"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_date_hour_minute_second_millis("uuuu-MM-dd'T'HH:mm:ss.SSS"), //
|
|
||||||
date_optional_time("uuuu-MM-dd['T'HH:mm:ss.SSSXXX]"), //
|
date_optional_time("uuuu-MM-dd['T'HH:mm:ss.SSSXXX]"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_date_optional_time("uuuu-MM-dd['T'HH:mm:ss.SSSXXX]"), //
|
|
||||||
strict_date_optional_time_nanos("uuuu-MM-dd['T'HH:mm:ss.SSSSSSXXX]"), //
|
strict_date_optional_time_nanos("uuuu-MM-dd['T'HH:mm:ss.SSSSSSXXX]"), //
|
||||||
date_time("uuuu-MM-dd'T'HH:mm:ss.SSSXXX"), //
|
date_time("uuuu-MM-dd'T'HH:mm:ss.SSSXXX"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_date_time("uuuu-MM-dd'T'HH:mm:ss.SSSXXX"), //
|
|
||||||
date_time_no_millis("uuuu-MM-dd'T'HH:mm:ssVV"), // here Elasticsearch uses the zone-id in its implementation
|
date_time_no_millis("uuuu-MM-dd'T'HH:mm:ssVV"), // here Elasticsearch uses the zone-id in its implementation
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_date_time_no_millis("uuuu-MM-dd'T'HH:mm:ssVV"), // here Elasticsearch uses the zone-id in its implementation
|
|
||||||
epoch_millis("epoch_millis"), //
|
epoch_millis("epoch_millis"), //
|
||||||
epoch_second("epoch_second"), //
|
epoch_second("epoch_second"), //
|
||||||
hour("HH"), //
|
hour("HH"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_hour("HH"), //
|
|
||||||
hour_minute("HH:mm"), //
|
hour_minute("HH:mm"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_hour_minute("HH:mm"), //
|
|
||||||
hour_minute_second("HH:mm:ss"), //
|
hour_minute_second("HH:mm:ss"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_hour_minute_second("HH:mm:ss"), //
|
|
||||||
hour_minute_second_fraction("HH:mm:ss.SSS"), //
|
hour_minute_second_fraction("HH:mm:ss.SSS"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_hour_minute_second_fraction("HH:mm:ss.SSS"), //
|
|
||||||
hour_minute_second_millis("HH:mm:ss.SSS"), //
|
hour_minute_second_millis("HH:mm:ss.SSS"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_hour_minute_second_millis("HH:mm:ss.SSS"), //
|
|
||||||
ordinal_date("uuuu-DDD"), //
|
ordinal_date("uuuu-DDD"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_ordinal_date("uuuu-DDD"), //
|
|
||||||
ordinal_date_time("uuuu-DDD'T'HH:mm:ss.SSSXXX"), //
|
ordinal_date_time("uuuu-DDD'T'HH:mm:ss.SSSXXX"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_ordinal_date_time("uuuu-DDD'T'HH:mm:ss.SSSXXX"), //
|
|
||||||
ordinal_date_time_no_millis("uuuu-DDD'T'HH:mm:ssXXX"), //
|
ordinal_date_time_no_millis("uuuu-DDD'T'HH:mm:ssXXX"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_ordinal_date_time_no_millis("uuuu-DDD'T'HH:mm:ssXXX"), //
|
|
||||||
time("HH:mm:ss.SSSXXX"), //
|
time("HH:mm:ss.SSSXXX"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_time("HH:mm:ss.SSSXXX"), //
|
|
||||||
time_no_millis("HH:mm:ssXXX"), //
|
time_no_millis("HH:mm:ssXXX"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_time_no_millis("HH:mm:ssXXX"), //
|
|
||||||
t_time("'T'HH:mm:ss.SSSXXX"), //
|
t_time("'T'HH:mm:ss.SSSXXX"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_t_time("'T'HH:mm:ss.SSSXXX"), //
|
|
||||||
t_time_no_millis("'T'HH:mm:ssXXX"), //
|
t_time_no_millis("'T'HH:mm:ssXXX"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_t_time_no_millis("'T'HH:mm:ssXXX"), //
|
|
||||||
week_date("YYYY-'W'ww-e"), //
|
week_date("YYYY-'W'ww-e"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_week_date("YYYY-'W'ww-e"), //
|
|
||||||
week_date_time("YYYY-'W'ww-e'T'HH:mm:ss.SSSXXX"), //
|
week_date_time("YYYY-'W'ww-e'T'HH:mm:ss.SSSXXX"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_week_date_time("YYYY-'W'ww-e'T'HH:mm:ss.SSSXXX"), //
|
|
||||||
week_date_time_no_millis("YYYY-'W'ww-e'T'HH:mm:ssXXX"), //
|
week_date_time_no_millis("YYYY-'W'ww-e'T'HH:mm:ssXXX"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_week_date_time_no_millis("YYYY-'W'ww-e'T'HH:mm:ssXXX"), //
|
|
||||||
weekyear(""), // no TemporalAccessor available for these 3
|
weekyear(""), // no TemporalAccessor available for these 3
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_weekyear(""), // no TemporalAccessor available for these 3
|
|
||||||
weekyear_week(""), //
|
weekyear_week(""), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_weekyear_week(""), //
|
|
||||||
weekyear_week_day(""), //
|
weekyear_week_day(""), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_strict_weekyear_week_day(""), //
|
|
||||||
year("uuuu"), //
|
year("uuuu"), //
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_year("uuuu"), //
|
|
||||||
year_month("uuuu-MM"), //
|
year_month("uuuu-MM"), //
|
||||||
/**
|
year_month_day("uuuu-MM-dd"); //
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_year_month("uuuu-MM"), //
|
|
||||||
year_month_day("uuuu-MM-dd"), //
|
|
||||||
/**
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
strict_year_month_day("uuuu-MM-dd"); //
|
|
||||||
|
|
||||||
private final String pattern;
|
private final String pattern;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2025 the original author or authors.
|
* Copyright 2013-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -100,13 +100,6 @@ public @interface Document {
|
|||||||
*/
|
*/
|
||||||
boolean storeVersionInSource() default true;
|
boolean storeVersionInSource() default true;
|
||||||
|
|
||||||
/**
|
|
||||||
* Aliases for the index.
|
|
||||||
*
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
Alias[] aliases() default {};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 4.3
|
* @since 4.3
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2025 the original author or authors.
|
* Copyright 2013-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -37,8 +37,6 @@ import org.springframework.core.annotation.AliasFor;
|
|||||||
* @author Brian Kimmig
|
* @author Brian Kimmig
|
||||||
* @author Morgan Lutz
|
* @author Morgan Lutz
|
||||||
* @author Sascha Woo
|
* @author Sascha Woo
|
||||||
* @author Haibo Liu
|
|
||||||
* @author Andriy Redko
|
|
||||||
*/
|
*/
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Target({ ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.METHOD })
|
@Target({ ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.METHOD })
|
||||||
@ -130,10 +128,6 @@ public @interface Field {
|
|||||||
boolean norms() default true;
|
boolean norms() default true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NOte that null_value setting are not supported in Elasticsearch for all types. For example setting a null_value on
|
|
||||||
* a field with type text will throw an exception in the server when the mapping is written to Elasticsearch. Alas,
|
|
||||||
* the Elasticsearch documentation does not specify on which types it is allowed on which it is not.
|
|
||||||
*
|
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
String nullValue() default "";
|
String nullValue() default "";
|
||||||
@ -201,27 +195,6 @@ public @interface Field {
|
|||||||
*/
|
*/
|
||||||
int dims() default -1;
|
int dims() default -1;
|
||||||
|
|
||||||
/**
|
|
||||||
* to be used in combination with {@link FieldType#Dense_Vector}
|
|
||||||
*
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
String elementType() default FieldElementType.DEFAULT;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* to be used in combination with {@link FieldType#Dense_Vector}
|
|
||||||
*
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
KnnSimilarity knnSimilarity() default KnnSimilarity.DEFAULT;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* to be used in combination with {@link FieldType#Dense_Vector}
|
|
||||||
*
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
KnnIndexOptions[] knnIndexOptions() default {};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controls how Elasticsearch dynamically adds fields to the inner object within the document.<br>
|
* Controls how Elasticsearch dynamically adds fields to the inner object within the document.<br>
|
||||||
* To be used in combination with {@link FieldType#Object} or {@link FieldType#Nested}
|
* To be used in combination with {@link FieldType#Object} or {@link FieldType#Nested}
|
||||||
@ -245,11 +218,4 @@ public @interface Field {
|
|||||||
* @since 5.1
|
* @since 5.1
|
||||||
*/
|
*/
|
||||||
boolean storeEmptyValue() default true;
|
boolean storeEmptyValue() default true;
|
||||||
|
|
||||||
/**
|
|
||||||
* overrides the field type in the mapping which otherwise will be taken from corresponding {@link FieldType}
|
|
||||||
*
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
String mappedTypeName() default "";
|
|
||||||
}
|
}
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2024-2025 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.springframework.data.elasticsearch.annotations;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Haibo Liu
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
public final class FieldElementType {
|
|
||||||
public final static String DEFAULT = "";
|
|
||||||
public final static String FLOAT = "float";
|
|
||||||
public final static String BYTE = "byte";
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2025 the original author or authors.
|
* Copyright 2013-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2024-2025 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.springframework.data.elasticsearch.annotations;
|
|
||||||
|
|
||||||
import org.springframework.core.annotation.AliasFor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Query used to limit documents.
|
|
||||||
*
|
|
||||||
* @author Youssef Aouichaoui
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
public @interface Filter {
|
|
||||||
/**
|
|
||||||
* @return Query used to limit documents. Alias for {@link #query}.
|
|
||||||
*/
|
|
||||||
@AliasFor("query")
|
|
||||||
String value() default "";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Query used to limit documents. Alias for {@link #value}.
|
|
||||||
*/
|
|
||||||
@AliasFor("value")
|
|
||||||
String query() default "";
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2025 the original author or authors.
|
* Copyright 2013-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2017-2025 the original author or authors.
|
* Copyright 2017-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2020-2025 the original author or authors.
|
* Copyright 2020-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2020-2025 the original author or authors.
|
* Copyright 2020-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2020-2025 the original author or authors.
|
* Copyright 2020-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -21,7 +21,6 @@ import java.lang.annotation.RetentionPolicy;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Peter-Josef Meisch
|
* @author Peter-Josef Meisch
|
||||||
* @author Haibo Liu
|
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
@Documented
|
@Documented
|
||||||
@ -60,8 +59,6 @@ public @interface HighlightParameters {
|
|||||||
|
|
||||||
int numberOfFragments() default -1;
|
int numberOfFragments() default -1;
|
||||||
|
|
||||||
Query highlightQuery() default @Query;
|
|
||||||
|
|
||||||
String order() default "";
|
String order() default "";
|
||||||
|
|
||||||
int phraseLimit() default -1;
|
int phraseLimit() default -1;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2019-2025 the original author or authors.
|
* Copyright 2019-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2019-2025 the original author or authors.
|
* Copyright 2019-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2023-2025 the original author or authors.
|
* Copyright 2023-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -15,6 +15,9 @@
|
|||||||
*/
|
*/
|
||||||
package org.springframework.data.elasticsearch.annotations;
|
package org.springframework.data.elasticsearch.annotations;
|
||||||
|
|
||||||
|
import org.springframework.data.annotation.ReadOnlyProperty;
|
||||||
|
import org.springframework.data.annotation.Transient;
|
||||||
|
|
||||||
import java.lang.annotation.Documented;
|
import java.lang.annotation.Documented;
|
||||||
import java.lang.annotation.ElementType;
|
import java.lang.annotation.ElementType;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
@ -22,10 +25,10 @@ import java.lang.annotation.RetentionPolicy;
|
|||||||
import java.lang.annotation.Target;
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Annotation to mark a String property of an entity to be filled with the name of the index where the entity was stored
|
* Annotation to mark a String property of an entity to be filled with the name of the index where the entity was
|
||||||
* after it is indexed into Elasticsearch. This can be used when the name of the index is dynamically created or when a
|
* stored after it is indexed into Elasticsearch. This can be used when the name of the index is dynamically created
|
||||||
* document was indexed into a write alias.
|
* or when a document was indexed into a write alias.
|
||||||
* <p>
|
*
|
||||||
* This can not be used to specify the index where an entity should be written to.
|
* This can not be used to specify the index where an entity should be written to.
|
||||||
*
|
*
|
||||||
* @author Peter-Josef Meisch
|
* @author Peter-Josef Meisch
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014-2025 the original author or authors.
|
* Copyright 2014-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -29,8 +29,6 @@ import java.lang.annotation.Target;
|
|||||||
* @author Aleksei Arsenev
|
* @author Aleksei Arsenev
|
||||||
* @author Brian Kimmig
|
* @author Brian Kimmig
|
||||||
* @author Morgan Lutz
|
* @author Morgan Lutz
|
||||||
* @author Haibo Liu
|
|
||||||
* @author Andriy Redko
|
|
||||||
*/
|
*/
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Target(ElementType.ANNOTATION_TYPE)
|
@Target(ElementType.ANNOTATION_TYPE)
|
||||||
@ -151,32 +149,4 @@ public @interface InnerField {
|
|||||||
* @since 4.2
|
* @since 4.2
|
||||||
*/
|
*/
|
||||||
int dims() default -1;
|
int dims() default -1;
|
||||||
|
|
||||||
/**
|
|
||||||
* to be used in combination with {@link FieldType#Dense_Vector}
|
|
||||||
*
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
String elementType() default FieldElementType.DEFAULT;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* to be used in combination with {@link FieldType#Dense_Vector}
|
|
||||||
*
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
KnnSimilarity knnSimilarity() default KnnSimilarity.DEFAULT;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* to be used in combination with {@link FieldType#Dense_Vector}
|
|
||||||
*
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
KnnIndexOptions[] knnIndexOptions() default {};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* overrides the field type in the mapping which otherwise will be taken from corresponding {@link FieldType}
|
|
||||||
*
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
String mappedTypeName() default "";
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2020-2025 the original author or authors.
|
* Copyright 2020-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2020-2025 the original author or authors.
|
* Copyright 2020-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2024-2025 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.springframework.data.elasticsearch.annotations;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Haibo Liu
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
public enum KnnAlgorithmType {
|
|
||||||
HNSW("hnsw"),
|
|
||||||
INT8_HNSW("int8_hnsw"),
|
|
||||||
FLAT("flat"),
|
|
||||||
INT8_FLAT("int8_flat"),
|
|
||||||
DEFAULT("");
|
|
||||||
|
|
||||||
private final String type;
|
|
||||||
|
|
||||||
KnnAlgorithmType(String type) {
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getType() {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2024-2025 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.springframework.data.elasticsearch.annotations;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Haibo Liu
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
public @interface KnnIndexOptions {
|
|
||||||
|
|
||||||
KnnAlgorithmType type() default KnnAlgorithmType.DEFAULT;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Only applicable to {@link KnnAlgorithmType#HNSW} and {@link KnnAlgorithmType#INT8_HNSW} index types.
|
|
||||||
*/
|
|
||||||
int m() default -1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Only applicable to {@link KnnAlgorithmType#HNSW} and {@link KnnAlgorithmType#INT8_HNSW} index types.
|
|
||||||
*/
|
|
||||||
int efConstruction() default -1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Only applicable to {@link KnnAlgorithmType#INT8_HNSW} and {@link KnnAlgorithmType#INT8_FLAT} index types.
|
|
||||||
*/
|
|
||||||
float confidenceInterval() default -1F;
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2024-2025 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.springframework.data.elasticsearch.annotations;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Haibo Liu
|
|
||||||
* @since 5.4
|
|
||||||
*/
|
|
||||||
public enum KnnSimilarity {
|
|
||||||
L2_NORM("l2_norm"),
|
|
||||||
DOT_PRODUCT("dot_product"),
|
|
||||||
COSINE("cosine"),
|
|
||||||
MAX_INNER_PRODUCT("max_inner_product"),
|
|
||||||
DEFAULT("");
|
|
||||||
|
|
||||||
private final String similarity;
|
|
||||||
|
|
||||||
KnnSimilarity(String similarity) {
|
|
||||||
this.similarity = similarity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSimilarity() {
|
|
||||||
return similarity;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014-2025 the original author or authors.
|
* Copyright 2014-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -74,14 +74,7 @@ public @interface Mapping {
|
|||||||
*/
|
*/
|
||||||
String runtimeFieldsPath() default "";
|
String runtimeFieldsPath() default "";
|
||||||
|
|
||||||
/**
|
|
||||||
* field alias definitions to be written to the index mapping
|
|
||||||
*
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
MappingAlias[] aliases() default {};
|
|
||||||
|
|
||||||
enum Detection {
|
enum Detection {
|
||||||
DEFAULT, TRUE, FALSE
|
DEFAULT, TRUE, FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2024-2025 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.springframework.data.elasticsearch.annotations;
|
|
||||||
|
|
||||||
import java.lang.annotation.Documented;
|
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Inherited;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Defines a field alias in the index mapping.
|
|
||||||
*
|
|
||||||
* @author Peter-Josef Meisch
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
@Target(ElementType.FIELD)
|
|
||||||
@Documented
|
|
||||||
@Inherited
|
|
||||||
public @interface MappingAlias {
|
|
||||||
/**
|
|
||||||
* the name of the alias.
|
|
||||||
*/
|
|
||||||
String name();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* the path of the alias.
|
|
||||||
*/
|
|
||||||
String path();
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014-2025 the original author or authors.
|
* Copyright 2014-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2020-2025 the original author or authors.
|
* Copyright 2020-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2025 the original author or authors.
|
* Copyright 2013-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2025 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.springframework.data.elasticsearch.annotations;
|
|
||||||
|
|
||||||
import org.springframework.data.annotation.QueryAnnotation;
|
|
||||||
|
|
||||||
import java.lang.annotation.Documented;
|
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Annotation to mark a repository method as a search template method. The annotation defines the search template id,
|
|
||||||
* the parameters for the search template are taken from the method's arguments.
|
|
||||||
*
|
|
||||||
* @author P.J. Meisch (pj.meisch@sothawo.com)
|
|
||||||
* @since 5.5
|
|
||||||
*/
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
@Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE })
|
|
||||||
@Documented
|
|
||||||
@QueryAnnotation
|
|
||||||
public @interface SearchTemplateQuery {
|
|
||||||
/**
|
|
||||||
* The id of the search template. Must not be empt or null.
|
|
||||||
*/
|
|
||||||
String id();
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2014-2025 the original author or authors.
|
* Copyright 2014-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2019-2025 the original author or authors.
|
* Copyright 2019-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2022-2025 the original author or authors.
|
* Copyright 2022-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2019-2025 the original author or authors.
|
* Copyright 2019-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -41,7 +41,7 @@ public @interface ValueConverter {
|
|||||||
* Defines the class implementing the {@link PropertyValueConverter} interface. If this is a normal class, it must
|
* Defines the class implementing the {@link PropertyValueConverter} interface. If this is a normal class, it must
|
||||||
* provide a default constructor with no arguments. If this is an enum and thus implementing a singleton by enum it
|
* provide a default constructor with no arguments. If this is an enum and thus implementing a singleton by enum it
|
||||||
* must only have one enum value.
|
* must only have one enum value.
|
||||||
*
|
*
|
||||||
* @return the class to use for conversion
|
* @return the class to use for conversion
|
||||||
*/
|
*/
|
||||||
Class<? extends PropertyValueConverter> value();
|
Class<? extends PropertyValueConverter> value();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2022-2025 the original author or authors.
|
* Copyright 2022-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
@org.jspecify.annotations.NullMarked
|
@org.springframework.lang.NonNullApi
|
||||||
|
@org.springframework.lang.NonNullFields
|
||||||
package org.springframework.data.elasticsearch.annotations;
|
package org.springframework.data.elasticsearch.annotations;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2023-2025 the original author or authors.
|
* Copyright 2023-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -25,11 +25,11 @@ import org.springframework.data.util.ReactiveWrappers;
|
|||||||
*/
|
*/
|
||||||
public class ElasticsearchAotPredicates {
|
public class ElasticsearchAotPredicates {
|
||||||
|
|
||||||
public static final Predicate<ReactiveWrappers.ReactiveLibrary> IS_REACTIVE_LIBRARY_AVAILABLE = (
|
public static final Predicate<ReactiveWrappers.ReactiveLibrary> IS_REACTIVE_LIBARARY_AVAILABLE = (
|
||||||
lib) -> ReactiveWrappers.isAvailable(lib);
|
lib) -> ReactiveWrappers.isAvailable(lib);
|
||||||
|
|
||||||
public static boolean isReactorPresent() {
|
public static boolean isReactorPresent() {
|
||||||
return IS_REACTIVE_LIBRARY_AVAILABLE.test(ReactiveWrappers.ReactiveLibrary.PROJECT_REACTOR);
|
return IS_REACTIVE_LIBARARY_AVAILABLE.test(ReactiveWrappers.ReactiveLibrary.PROJECT_REACTOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2023-2025 the original author or authors.
|
* Copyright 2023-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -19,7 +19,6 @@ import static org.springframework.data.elasticsearch.aot.ElasticsearchAotPredica
|
|||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
import org.jspecify.annotations.Nullable;
|
|
||||||
import org.springframework.aot.hint.MemberCategory;
|
import org.springframework.aot.hint.MemberCategory;
|
||||||
import org.springframework.aot.hint.RuntimeHints;
|
import org.springframework.aot.hint.RuntimeHints;
|
||||||
import org.springframework.aot.hint.RuntimeHintsRegistrar;
|
import org.springframework.aot.hint.RuntimeHintsRegistrar;
|
||||||
@ -33,6 +32,7 @@ import org.springframework.data.elasticsearch.core.event.ReactiveAfterConvertCal
|
|||||||
import org.springframework.data.elasticsearch.core.event.ReactiveAfterLoadCallback;
|
import org.springframework.data.elasticsearch.core.event.ReactiveAfterLoadCallback;
|
||||||
import org.springframework.data.elasticsearch.core.event.ReactiveAfterSaveCallback;
|
import org.springframework.data.elasticsearch.core.event.ReactiveAfterSaveCallback;
|
||||||
import org.springframework.data.elasticsearch.core.event.ReactiveBeforeConvertCallback;
|
import org.springframework.data.elasticsearch.core.event.ReactiveBeforeConvertCallback;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Peter-Josef Meisch
|
* @author Peter-Josef Meisch
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
@org.jspecify.annotations.NullMarked
|
@org.springframework.lang.NonNullApi
|
||||||
|
@org.springframework.lang.NonNullFields
|
||||||
package org.springframework.data.elasticsearch.aot;
|
package org.springframework.data.elasticsearch.aot;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2018-2025 the original author or authors.
|
* Copyright 2018-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -25,8 +25,8 @@ import java.util.function.Supplier;
|
|||||||
import javax.net.ssl.HostnameVerifier;
|
import javax.net.ssl.HostnameVerifier;
|
||||||
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLContext;
|
||||||
|
|
||||||
import org.jspecify.annotations.Nullable;
|
|
||||||
import org.springframework.data.elasticsearch.support.HttpHeaders;
|
import org.springframework.data.elasticsearch.support.HttpHeaders;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configuration interface exposing common client configuration properties for Elasticsearch clients.
|
* Configuration interface exposing common client configuration properties for Elasticsearch clients.
|
||||||
@ -233,15 +233,6 @@ public interface ClientConfiguration {
|
|||||||
*/
|
*/
|
||||||
TerminalClientConfigurationBuilder usingSsl();
|
TerminalClientConfigurationBuilder usingSsl();
|
||||||
|
|
||||||
/**
|
|
||||||
* Connects using https if flag is true.
|
|
||||||
*
|
|
||||||
* @param flag whether to use https in the connection
|
|
||||||
* @return the {@link TerminalClientConfigurationBuilder}
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
TerminalClientConfigurationBuilder usingSsl(boolean flag);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connect via {@literal https} using the given {@link SSLContext}.<br />
|
* Connect via {@literal https} using the given {@link SSLContext}.<br />
|
||||||
* <strong>NOTE</strong> You need to leave out the protocol in
|
* <strong>NOTE</strong> You need to leave out the protocol in
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2018-2025 the original author or authors.
|
* Copyright 2018-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -25,11 +25,12 @@ import java.util.function.Supplier;
|
|||||||
import javax.net.ssl.HostnameVerifier;
|
import javax.net.ssl.HostnameVerifier;
|
||||||
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLContext;
|
||||||
|
|
||||||
import org.jspecify.annotations.Nullable;
|
import org.elasticsearch.client.RestClientBuilder.HttpClientConfigCallback;
|
||||||
import org.springframework.data.elasticsearch.client.ClientConfiguration.ClientConfigurationBuilderWithRequiredEndpoint;
|
import org.springframework.data.elasticsearch.client.ClientConfiguration.ClientConfigurationBuilderWithRequiredEndpoint;
|
||||||
import org.springframework.data.elasticsearch.client.ClientConfiguration.MaybeSecureClientConfigurationBuilder;
|
import org.springframework.data.elasticsearch.client.ClientConfiguration.MaybeSecureClientConfigurationBuilder;
|
||||||
import org.springframework.data.elasticsearch.client.ClientConfiguration.TerminalClientConfigurationBuilder;
|
import org.springframework.data.elasticsearch.client.ClientConfiguration.TerminalClientConfigurationBuilder;
|
||||||
import org.springframework.data.elasticsearch.support.HttpHeaders;
|
import org.springframework.data.elasticsearch.support.HttpHeaders;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -105,13 +106,6 @@ class ClientConfigurationBuilder
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public TerminalClientConfigurationBuilder usingSsl(boolean flag) {
|
|
||||||
|
|
||||||
this.useSsl = flag;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
* @see org.springframework.data.elasticsearch.client.ClientConfiguration.MaybeSecureClientConfigurationBuilder#usingSsl(javax.net.ssl.SSLContext)
|
* @see org.springframework.data.elasticsearch.client.ClientConfiguration.MaybeSecureClientConfigurationBuilder#usingSsl(javax.net.ssl.SSLContext)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2018-2025 the original author or authors.
|
* Copyright 2018-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -24,8 +24,9 @@ import java.util.function.Supplier;
|
|||||||
import javax.net.ssl.HostnameVerifier;
|
import javax.net.ssl.HostnameVerifier;
|
||||||
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLContext;
|
||||||
|
|
||||||
import org.jspecify.annotations.Nullable;
|
import org.elasticsearch.client.RestClientBuilder.HttpClientConfigCallback;
|
||||||
import org.springframework.data.elasticsearch.support.HttpHeaders;
|
import org.springframework.data.elasticsearch.support.HttpHeaders;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default {@link ClientConfiguration} implementation.
|
* Default {@link ClientConfiguration} implementation.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2018-2025 the original author or authors.
|
* Copyright 2018-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2018-2025 the original author or authors.
|
* Copyright 2018-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2018-2025 the original author or authors.
|
* Copyright 2018-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2022-2025 the original author or authors.
|
* Copyright 2022-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2022-2025 the original author or authors.
|
* Copyright 2022-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,70 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2024-2025 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.springframework.data.elasticsearch.client.elc;
|
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
import org.jspecify.annotations.Nullable;
|
|
||||||
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
|
|
||||||
import org.springframework.data.elasticsearch.core.query.Query;
|
|
||||||
import org.springframework.data.elasticsearch.core.query.StringQuery;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An abstract class that serves as a base for query processors. It provides a common interface and basic functionality
|
|
||||||
* for query processing.
|
|
||||||
*
|
|
||||||
* @author Aouichaoui Youssef
|
|
||||||
* @since 5.3
|
|
||||||
*/
|
|
||||||
public abstract class AbstractQueryProcessor {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a spring-data-elasticsearch {@literal query} to an Elasticsearch {@literal query}.
|
|
||||||
*
|
|
||||||
* @param query spring-data-elasticsearch {@literal query}.
|
|
||||||
* @param queryConverter correct mapped field names and the values to the converted values.
|
|
||||||
* @return an Elasticsearch {@literal query}.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static co.elastic.clients.elasticsearch._types.query_dsl.@Nullable Query getEsQuery(@Nullable Query query,
|
|
||||||
@Nullable Consumer<Query> queryConverter) {
|
|
||||||
if (query == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (queryConverter != null) {
|
|
||||||
queryConverter.accept(query);
|
|
||||||
}
|
|
||||||
|
|
||||||
co.elastic.clients.elasticsearch._types.query_dsl.Query esQuery = null;
|
|
||||||
|
|
||||||
if (query instanceof CriteriaQuery criteriaQuery) {
|
|
||||||
esQuery = CriteriaQueryProcessor.createQuery(criteriaQuery.getCriteria());
|
|
||||||
} else if (query instanceof StringQuery stringQuery) {
|
|
||||||
esQuery = Queries.wrapperQueryAsQuery(stringQuery.getSource());
|
|
||||||
} else if (query instanceof NativeQuery nativeQuery) {
|
|
||||||
if (nativeQuery.getQuery() != null) {
|
|
||||||
esQuery = nativeQuery.getQuery();
|
|
||||||
} else if (nativeQuery.getSpringDataQuery() != null) {
|
|
||||||
esQuery = getEsQuery(nativeQuery.getSpringDataQuery(), queryConverter);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new IllegalArgumentException("unhandled Query implementation " + query.getClass().getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
return esQuery;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2022-2025 the original author or authors.
|
* Copyright 2022-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -16,10 +16,9 @@
|
|||||||
package org.springframework.data.elasticsearch.client.elc;
|
package org.springframework.data.elasticsearch.client.elc;
|
||||||
|
|
||||||
import co.elastic.clients.elasticsearch.ElasticsearchClient;
|
import co.elastic.clients.elasticsearch.ElasticsearchClient;
|
||||||
|
import co.elastic.clients.elasticsearch.cluster.ElasticsearchClusterClient;
|
||||||
import co.elastic.clients.transport.ElasticsearchTransport;
|
import co.elastic.clients.transport.ElasticsearchTransport;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import org.elasticsearch.client.RestClient;
|
import org.elasticsearch.client.RestClient;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
@ -38,10 +37,12 @@ public class AutoCloseableElasticsearchClient extends ElasticsearchClient implem
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() throws IOException {
|
public void close() throws Exception {
|
||||||
// since Elasticsearch 8.16 the ElasticsearchClient implements (through ApiClient) the Closeable interface and
|
transport.close();
|
||||||
// handles closing of the underlying transport. We now just call the base class, but keep this as we
|
}
|
||||||
// have been implementing AutoCloseable since 4.4 and won't change that to a mere Closeable
|
|
||||||
super.close();
|
@Override
|
||||||
|
public ElasticsearchClusterClient cluster() {
|
||||||
|
return super.cluster();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -39,7 +39,6 @@ import org.springframework.data.elasticsearch.core.geo.GeoBox;
|
|||||||
import org.springframework.data.elasticsearch.core.geo.GeoJson;
|
import org.springframework.data.elasticsearch.core.geo.GeoJson;
|
||||||
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
|
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
|
||||||
import org.springframework.data.elasticsearch.core.query.Criteria;
|
import org.springframework.data.elasticsearch.core.query.Criteria;
|
||||||
import org.springframework.data.elasticsearch.utils.geohash.Geohash;
|
|
||||||
import org.springframework.data.geo.Box;
|
import org.springframework.data.geo.Box;
|
||||||
import org.springframework.data.geo.Distance;
|
import org.springframework.data.geo.Distance;
|
||||||
import org.springframework.data.geo.Metrics;
|
import org.springframework.data.geo.Metrics;
|
||||||
@ -51,7 +50,6 @@ import org.springframework.util.Assert;
|
|||||||
* filter.
|
* filter.
|
||||||
*
|
*
|
||||||
* @author Peter-Josef Meisch
|
* @author Peter-Josef Meisch
|
||||||
* @author Junghoon Ban
|
|
||||||
* @since 4.4
|
* @since 4.4
|
||||||
*/
|
*/
|
||||||
class CriteriaFilterProcessor {
|
class CriteriaFilterProcessor {
|
||||||
@ -70,17 +68,10 @@ class CriteriaFilterProcessor {
|
|||||||
for (Criteria chainedCriteria : criteria.getCriteriaChain()) {
|
for (Criteria chainedCriteria : criteria.getCriteriaChain()) {
|
||||||
|
|
||||||
if (chainedCriteria.isOr()) {
|
if (chainedCriteria.isOr()) {
|
||||||
Collection<? extends Query> queriesForEntries = queriesForEntries(chainedCriteria);
|
BoolQuery.Builder boolQueryBuilder = QueryBuilders.bool();
|
||||||
|
queriesForEntries(chainedCriteria).forEach(boolQueryBuilder::should);
|
||||||
if (!queriesForEntries.isEmpty()) {
|
filterQueries.add(new Query(boolQueryBuilder.build()));
|
||||||
BoolQuery.Builder boolQueryBuilder = QueryBuilders.bool();
|
|
||||||
queriesForEntries.forEach(boolQueryBuilder::should);
|
|
||||||
filterQueries.add(new Query(boolQueryBuilder.build()));
|
|
||||||
}
|
|
||||||
} else if (chainedCriteria.isNegating()) {
|
} else if (chainedCriteria.isNegating()) {
|
||||||
|
|
||||||
Assert.notNull(criteria.getField(), "criteria must have a field");
|
|
||||||
|
|
||||||
Collection<? extends Query> negatingFilters = buildNegatingFilter(criteria.getField().getName(),
|
Collection<? extends Query> negatingFilters = buildNegatingFilter(criteria.getField().getName(),
|
||||||
criteria.getFilterCriteriaEntries());
|
criteria.getFilterCriteriaEntries());
|
||||||
filterQueries.addAll(negatingFilters);
|
filterQueries.addAll(negatingFilters);
|
||||||
@ -124,7 +115,6 @@ class CriteriaFilterProcessor {
|
|||||||
private static Collection<? extends Query> queriesForEntries(Criteria criteria) {
|
private static Collection<? extends Query> queriesForEntries(Criteria criteria) {
|
||||||
|
|
||||||
Assert.notNull(criteria.getField(), "criteria must have a field");
|
Assert.notNull(criteria.getField(), "criteria must have a field");
|
||||||
|
|
||||||
String fieldName = criteria.getField().getName();
|
String fieldName = criteria.getField().getName();
|
||||||
Assert.notNull(fieldName, "Unknown field");
|
Assert.notNull(fieldName, "Unknown field");
|
||||||
|
|
||||||
@ -179,17 +169,17 @@ class CriteriaFilterProcessor {
|
|||||||
Assert.isTrue(values[1] instanceof String || values[1] instanceof Distance,
|
Assert.isTrue(values[1] instanceof String || values[1] instanceof Distance,
|
||||||
"Second element of a geo distance filter must be a text or a Distance");
|
"Second element of a geo distance filter must be a text or a Distance");
|
||||||
|
|
||||||
String dist = (values[1] instanceof Distance distance) ? extractDistanceString(distance) : (String) values[1];
|
String dist = (values[1] instanceof Distance) ? extractDistanceString((Distance) values[1]) : (String) values[1];
|
||||||
|
|
||||||
return QueryBuilders.geoDistance() //
|
return QueryBuilders.geoDistance() //
|
||||||
.field(fieldName) //
|
.field(fieldName) //
|
||||||
.distance(dist) //
|
.distance(dist) //
|
||||||
.distanceType(GeoDistanceType.Plane) //
|
.distanceType(GeoDistanceType.Plane) //
|
||||||
.location(location -> {
|
.location(location -> {
|
||||||
if (values[0] instanceof GeoPoint loc) {
|
if (values[0]instanceof GeoPoint loc) {
|
||||||
location.latlon(latlon -> latlon.lat(loc.getLat()).lon(loc.getLon()));
|
location.latlon(latlon -> latlon.lat(loc.getLat()).lon(loc.getLon()));
|
||||||
} else if (values[0] instanceof Point point) {
|
} else if (values[0] instanceof Point) {
|
||||||
GeoPoint loc = GeoPoint.fromPoint(point);
|
GeoPoint loc = GeoPoint.fromPoint((Point) values[0]);
|
||||||
location.latlon(latlon -> latlon.lat(loc.getLat()).lon(loc.getLon()));
|
location.latlon(latlon -> latlon.lat(loc.getLat()).lon(loc.getLon()));
|
||||||
} else {
|
} else {
|
||||||
String loc = (String) values[0];
|
String loc = (String) values[0];
|
||||||
@ -230,8 +220,8 @@ class CriteriaFilterProcessor {
|
|||||||
"single-element of boundedBy filter must be type of GeoBox or Box");
|
"single-element of boundedBy filter must be type of GeoBox or Box");
|
||||||
|
|
||||||
GeoBox geoBBox;
|
GeoBox geoBBox;
|
||||||
if (value instanceof Box box) {
|
if (value instanceof Box) {
|
||||||
geoBBox = GeoBox.fromBox(box);
|
geoBBox = GeoBox.fromBox((Box) value);
|
||||||
} else {
|
} else {
|
||||||
geoBBox = (GeoBox) value;
|
geoBBox = (GeoBox) value;
|
||||||
}
|
}
|
||||||
@ -254,7 +244,7 @@ class CriteriaFilterProcessor {
|
|||||||
Assert.isTrue(allElementsAreOfType(values, GeoPoint.class) || allElementsAreOfType(values, String.class),
|
Assert.isTrue(allElementsAreOfType(values, GeoPoint.class) || allElementsAreOfType(values, String.class),
|
||||||
" both elements of boundedBy filter must be type of GeoPoint or text(format lat,lon or geohash)");
|
" both elements of boundedBy filter must be type of GeoPoint or text(format lat,lon or geohash)");
|
||||||
|
|
||||||
if (values[0] instanceof GeoPoint topLeft) {
|
if (values[0]instanceof GeoPoint topLeft) {
|
||||||
GeoPoint bottomRight = (GeoPoint) values[1];
|
GeoPoint bottomRight = (GeoPoint) values[1];
|
||||||
queryBuilder.boundingBox(bb -> bb //
|
queryBuilder.boundingBox(bb -> bb //
|
||||||
.tlbr(tlbr -> tlbr //
|
.tlbr(tlbr -> tlbr //
|
||||||
@ -276,10 +266,7 @@ class CriteriaFilterProcessor {
|
|||||||
.tlbr(tlbr -> tlbr //
|
.tlbr(tlbr -> tlbr //
|
||||||
.topLeft(glb -> {
|
.topLeft(glb -> {
|
||||||
if (isGeoHash) {
|
if (isGeoHash) {
|
||||||
// although the builder in 8.13.2 supports geohash, the server throws an error, so we convert to a
|
glb.geohash(gh -> gh.geohash(topLeft));
|
||||||
// lat,lon string here
|
|
||||||
glb.text(Geohash.toLatLon(topLeft));
|
|
||||||
// glb.geohash(gh -> gh.geohash(topLeft));
|
|
||||||
} else {
|
} else {
|
||||||
glb.text(topLeft);
|
glb.text(topLeft);
|
||||||
}
|
}
|
||||||
@ -287,8 +274,7 @@ class CriteriaFilterProcessor {
|
|||||||
}) //
|
}) //
|
||||||
.bottomRight(glb -> {
|
.bottomRight(glb -> {
|
||||||
if (isGeoHash) {
|
if (isGeoHash) {
|
||||||
glb.text(Geohash.toLatLon(bottomRight));
|
glb.geohash(gh -> gh.geohash(bottomRight));
|
||||||
// glb.geohash(gh -> gh.geohash(bottomRight));
|
|
||||||
} else {
|
} else {
|
||||||
glb.text(bottomRight);
|
glb.text(bottomRight);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -16,28 +16,22 @@
|
|||||||
package org.springframework.data.elasticsearch.client.elc;
|
package org.springframework.data.elasticsearch.client.elc;
|
||||||
|
|
||||||
import static org.springframework.data.elasticsearch.client.elc.Queries.*;
|
import static org.springframework.data.elasticsearch.client.elc.Queries.*;
|
||||||
import static org.springframework.data.elasticsearch.client.elc.TypeUtils.*;
|
|
||||||
import static org.springframework.util.StringUtils.*;
|
import static org.springframework.util.StringUtils.*;
|
||||||
|
|
||||||
import co.elastic.clients.elasticsearch._types.FieldValue;
|
import co.elastic.clients.elasticsearch._types.FieldValue;
|
||||||
import co.elastic.clients.elasticsearch._types.query_dsl.ChildScoreMode;
|
import co.elastic.clients.elasticsearch._types.query_dsl.ChildScoreMode;
|
||||||
import co.elastic.clients.elasticsearch._types.query_dsl.Operator;
|
import co.elastic.clients.elasticsearch._types.query_dsl.Operator;
|
||||||
import co.elastic.clients.elasticsearch._types.query_dsl.Query;
|
import co.elastic.clients.elasticsearch._types.query_dsl.Query;
|
||||||
import co.elastic.clients.elasticsearch.core.search.InnerHits;
|
|
||||||
import co.elastic.clients.json.JsonData;
|
import co.elastic.clients.json.JsonData;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import org.jspecify.annotations.Nullable;
|
|
||||||
import org.springframework.data.elasticsearch.annotations.FieldType;
|
import org.springframework.data.elasticsearch.annotations.FieldType;
|
||||||
import org.springframework.data.elasticsearch.core.query.Criteria;
|
import org.springframework.data.elasticsearch.core.query.Criteria;
|
||||||
import org.springframework.data.elasticsearch.core.query.Field;
|
import org.springframework.data.elasticsearch.core.query.Field;
|
||||||
import org.springframework.data.elasticsearch.core.query.HasChildQuery;
|
import org.springframework.lang.Nullable;
|
||||||
import org.springframework.data.elasticsearch.core.query.HasParentQuery;
|
|
||||||
import org.springframework.data.elasticsearch.core.query.InnerHitsQuery;
|
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -48,7 +42,7 @@ import org.springframework.util.Assert;
|
|||||||
* @author Ezequiel Antúnez Camacho
|
* @author Ezequiel Antúnez Camacho
|
||||||
* @since 4.4
|
* @since 4.4
|
||||||
*/
|
*/
|
||||||
class CriteriaQueryProcessor extends AbstractQueryProcessor {
|
class CriteriaQueryProcessor {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* creates a query from the criteria
|
* creates a query from the criteria
|
||||||
@ -116,18 +110,11 @@ class CriteriaQueryProcessor extends AbstractQueryProcessor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var filterQuery = CriteriaFilterProcessor.createQuery(criteria);
|
|
||||||
if (shouldQueries.isEmpty() && mustNotQueries.isEmpty() && mustQueries.isEmpty()) {
|
if (shouldQueries.isEmpty() && mustNotQueries.isEmpty() && mustQueries.isEmpty()) {
|
||||||
|
return null;
|
||||||
if (filterQuery.isEmpty()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// we need something to add the filter to
|
|
||||||
mustQueries.add(Query.of(qb -> qb.matchAll(m -> m)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Query.Builder().bool(boolQueryBuilder -> {
|
Query query = new Query.Builder().bool(boolQueryBuilder -> {
|
||||||
|
|
||||||
if (!shouldQueries.isEmpty()) {
|
if (!shouldQueries.isEmpty()) {
|
||||||
boolQueryBuilder.should(shouldQueries);
|
boolQueryBuilder.should(shouldQueries);
|
||||||
@ -141,10 +128,10 @@ class CriteriaQueryProcessor extends AbstractQueryProcessor {
|
|||||||
boolQueryBuilder.must(mustQueries);
|
boolQueryBuilder.must(mustQueries);
|
||||||
}
|
}
|
||||||
|
|
||||||
filterQuery.ifPresent(boolQueryBuilder::filter);
|
|
||||||
|
|
||||||
return boolQueryBuilder;
|
return boolQueryBuilder;
|
||||||
}).build();
|
}).build();
|
||||||
|
|
||||||
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@ -187,12 +174,6 @@ class CriteriaQueryProcessor extends AbstractQueryProcessor {
|
|||||||
.scoreMode(ChildScoreMode.Avg));
|
.scoreMode(ChildScoreMode.Avg));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (criteria.isNegating() && criteria.isOr()) {
|
|
||||||
final Query query = queryBuilder.build();
|
|
||||||
queryBuilder = new Query.Builder();
|
|
||||||
queryBuilder.bool(mnqb -> mnqb.mustNot(query));
|
|
||||||
}
|
|
||||||
|
|
||||||
return queryBuilder.build();
|
return queryBuilder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,57 +227,51 @@ class CriteriaQueryProcessor extends AbstractQueryProcessor {
|
|||||||
queryBuilder.queryString(queryStringQuery(fieldName, '*' + searchText, true, boost));
|
queryBuilder.queryString(queryStringQuery(fieldName, '*' + searchText, true, boost));
|
||||||
break;
|
break;
|
||||||
case EXPRESSION:
|
case EXPRESSION:
|
||||||
queryBuilder.queryString(queryStringQuery(fieldName, Objects.requireNonNull(value).toString(), boost));
|
queryBuilder.queryString(queryStringQuery(fieldName, value.toString(), boost));
|
||||||
break;
|
break;
|
||||||
case LESS:
|
case LESS:
|
||||||
queryBuilder
|
queryBuilder //
|
||||||
.range(rb -> rb
|
.range(rb -> rb //
|
||||||
.untyped(ut -> ut
|
.field(fieldName) //
|
||||||
.field(fieldName)
|
.lt(JsonData.of(value)) //
|
||||||
.lt(JsonData.of(value))
|
.boost(boost)); //
|
||||||
.boost(boost)));
|
|
||||||
break;
|
break;
|
||||||
case LESS_EQUAL:
|
case LESS_EQUAL:
|
||||||
queryBuilder
|
queryBuilder //
|
||||||
.range(rb -> rb
|
.range(rb -> rb //
|
||||||
.untyped(ut -> ut
|
.field(fieldName) //
|
||||||
.field(fieldName)
|
.lte(JsonData.of(value)) //
|
||||||
.lte(JsonData.of(value))
|
.boost(boost)); //
|
||||||
.boost(boost)));
|
|
||||||
break;
|
break;
|
||||||
case GREATER:
|
case GREATER:
|
||||||
queryBuilder
|
queryBuilder //
|
||||||
.range(rb -> rb
|
.range(rb -> rb //
|
||||||
.untyped(ut -> ut
|
.field(fieldName) //
|
||||||
.field(fieldName)
|
.gt(JsonData.of(value)) //
|
||||||
.gt(JsonData.of(value))
|
.boost(boost)); //
|
||||||
.boost(boost)));
|
|
||||||
break;
|
break;
|
||||||
case GREATER_EQUAL:
|
case GREATER_EQUAL:
|
||||||
queryBuilder
|
queryBuilder //
|
||||||
.range(rb -> rb
|
.range(rb -> rb //
|
||||||
.untyped(ut -> ut
|
.field(fieldName) //
|
||||||
.field(fieldName)
|
.gte(JsonData.of(value)) //
|
||||||
.gte(JsonData.of(value))
|
.boost(boost)); //
|
||||||
.boost(boost)));
|
|
||||||
break;
|
break;
|
||||||
case BETWEEN:
|
case BETWEEN:
|
||||||
Object[] ranges = (Object[]) value;
|
Object[] ranges = (Object[]) value;
|
||||||
Assert.notNull(value, "value for a between condition must not be null");
|
queryBuilder //
|
||||||
queryBuilder
|
.range(rb -> {
|
||||||
.range(rb -> rb
|
rb.field(fieldName);
|
||||||
.untyped(ut -> {
|
if (ranges[0] != null) {
|
||||||
ut.field(fieldName);
|
rb.gte(JsonData.of(ranges[0]));
|
||||||
if (ranges[0] != null) {
|
}
|
||||||
ut.gte(JsonData.of(ranges[0]));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ranges[1] != null) {
|
if (ranges[1] != null) {
|
||||||
ut.lte(JsonData.of(ranges[1]));
|
rb.lte(JsonData.of(ranges[1]));
|
||||||
}
|
}
|
||||||
ut.boost(boost); //
|
rb.boost(boost); //
|
||||||
return ut;
|
return rb;
|
||||||
}));
|
}); //
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case FUZZY:
|
case FUZZY:
|
||||||
@ -307,10 +282,10 @@ class CriteriaQueryProcessor extends AbstractQueryProcessor {
|
|||||||
.boost(boost)); //
|
.boost(boost)); //
|
||||||
break;
|
break;
|
||||||
case MATCHES:
|
case MATCHES:
|
||||||
queryBuilder.match(matchQuery(fieldName, Objects.requireNonNull(value).toString(), Operator.Or, boost));
|
queryBuilder.match(matchQuery(fieldName, value.toString(), Operator.Or, boost));
|
||||||
break;
|
break;
|
||||||
case MATCHES_ALL:
|
case MATCHES_ALL:
|
||||||
queryBuilder.match(matchQuery(fieldName, Objects.requireNonNull(value).toString(), Operator.And, boost));
|
queryBuilder.match(matchQuery(fieldName, value.toString(), Operator.And, boost));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case IN:
|
case IN:
|
||||||
@ -359,35 +334,9 @@ class CriteriaQueryProcessor extends AbstractQueryProcessor {
|
|||||||
queryBuilder //
|
queryBuilder //
|
||||||
.regexp(rb -> rb //
|
.regexp(rb -> rb //
|
||||||
.field(fieldName) //
|
.field(fieldName) //
|
||||||
.value(Objects.requireNonNull(value).toString()) //
|
.value(value.toString()) //
|
||||||
.boost(boost)); //
|
.boost(boost)); //
|
||||||
break;
|
break;
|
||||||
case HAS_CHILD:
|
|
||||||
if (value instanceof HasChildQuery query) {
|
|
||||||
queryBuilder.hasChild(hcb -> hcb
|
|
||||||
.type(query.getType())
|
|
||||||
.query(getEsQuery(query.getQuery(), null))
|
|
||||||
.innerHits(getInnerHits(query.getInnerHitsQuery()))
|
|
||||||
.ignoreUnmapped(query.getIgnoreUnmapped())
|
|
||||||
.minChildren(query.getMinChildren())
|
|
||||||
.maxChildren(query.getMaxChildren())
|
|
||||||
.scoreMode(scoreMode(query.getScoreMode())));
|
|
||||||
} else {
|
|
||||||
throw new CriteriaQueryException("value for " + fieldName + " is not a has_child query");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case HAS_PARENT:
|
|
||||||
if (value instanceof HasParentQuery query) {
|
|
||||||
queryBuilder.hasParent(hpb -> hpb
|
|
||||||
.parentType(query.getParentType())
|
|
||||||
.query(getEsQuery(query.getQuery(), null))
|
|
||||||
.innerHits(getInnerHits(query.getInnerHitsQuery()))
|
|
||||||
.ignoreUnmapped(query.getIgnoreUnmapped())
|
|
||||||
.score(query.getScore()));
|
|
||||||
} else {
|
|
||||||
throw new CriteriaQueryException("value for " + fieldName + " is not a has_parent query");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
throw new CriteriaQueryException("Could not build query for " + entry);
|
throw new CriteriaQueryException("Could not build query for " + entry);
|
||||||
}
|
}
|
||||||
@ -410,7 +359,7 @@ class CriteriaQueryProcessor extends AbstractQueryProcessor {
|
|||||||
|
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
|
|
||||||
if (!sb.isEmpty()) {
|
if (sb.length() > 0) {
|
||||||
sb.append(' ');
|
sb.append(' ');
|
||||||
}
|
}
|
||||||
sb.append('"');
|
sb.append('"');
|
||||||
@ -442,19 +391,4 @@ class CriteriaQueryProcessor extends AbstractQueryProcessor {
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a spring-data-elasticsearch {@literal inner_hits} to an Elasticsearch {@literal inner_hits} query.
|
|
||||||
*
|
|
||||||
* @param query spring-data-elasticsearch {@literal inner_hits}.
|
|
||||||
* @return an Elasticsearch {@literal inner_hits} query.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
private static InnerHits getInnerHits(@Nullable InnerHitsQuery query) {
|
|
||||||
if (query == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return InnerHits.of(iqb -> iqb.from(query.getFrom()).size(query.getSize()).name(query.getName()));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -24,17 +24,6 @@ import co.elastic.clients.elasticsearch.core.search.Hit;
|
|||||||
import co.elastic.clients.elasticsearch.core.search.NestedIdentity;
|
import co.elastic.clients.elasticsearch.core.search.NestedIdentity;
|
||||||
import co.elastic.clients.json.JsonData;
|
import co.elastic.clients.json.JsonData;
|
||||||
import co.elastic.clients.json.JsonpMapper;
|
import co.elastic.clients.json.JsonpMapper;
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
import org.jspecify.annotations.Nullable;
|
|
||||||
import org.springframework.data.elasticsearch.core.MultiGetItem;
|
|
||||||
import org.springframework.data.elasticsearch.core.document.Document;
|
|
||||||
import org.springframework.data.elasticsearch.core.document.Explanation;
|
|
||||||
import org.springframework.data.elasticsearch.core.document.NestedMetaData;
|
|
||||||
import org.springframework.data.elasticsearch.core.document.SearchDocument;
|
|
||||||
import org.springframework.data.elasticsearch.core.document.SearchDocumentAdapter;
|
|
||||||
import org.springframework.data.elasticsearch.core.document.SearchDocumentResponse;
|
|
||||||
import org.springframework.util.Assert;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
@ -43,199 +32,208 @@ import java.util.Map;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.springframework.data.elasticsearch.core.MultiGetItem;
|
||||||
|
import org.springframework.data.elasticsearch.core.document.Document;
|
||||||
|
import org.springframework.data.elasticsearch.core.document.Explanation;
|
||||||
|
import org.springframework.data.elasticsearch.core.document.NestedMetaData;
|
||||||
|
import org.springframework.data.elasticsearch.core.document.SearchDocument;
|
||||||
|
import org.springframework.data.elasticsearch.core.document.SearchDocumentAdapter;
|
||||||
|
import org.springframework.data.elasticsearch.core.document.SearchDocumentResponse;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility class to adapt different Elasticsearch responses to a
|
* Utility class to adapt different Elasticsearch responses to a
|
||||||
* {@link org.springframework.data.elasticsearch.core.document.Document}
|
* {@link org.springframework.data.elasticsearch.core.document.Document}
|
||||||
*
|
*
|
||||||
* @author Peter-Josef Meisch
|
* @author Peter-Josef Meisch
|
||||||
* @author Haibo Liu
|
|
||||||
* @author Mohamed El Harrougui
|
|
||||||
* @since 4.4
|
* @since 4.4
|
||||||
*/
|
*/
|
||||||
final class DocumentAdapters {
|
final class DocumentAdapters {
|
||||||
|
|
||||||
private static final Log LOGGER = LogFactory.getLog(DocumentAdapters.class);
|
private static final Log LOGGER = LogFactory.getLog(DocumentAdapters.class);
|
||||||
|
|
||||||
private DocumentAdapters() {
|
private DocumentAdapters() {}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a {@link SearchDocument} from a {@link Hit} returned by the Elasticsearch client.
|
* Creates a {@link SearchDocument} from a {@link Hit} returned by the Elasticsearch client.
|
||||||
*
|
*
|
||||||
* @param hit the hit object
|
* @param hit the hit object
|
||||||
* @param jsonpMapper to map JsonData objects
|
* @param jsonpMapper to map JsonData objects
|
||||||
* @return the created {@link SearchDocument}
|
* @return the created {@link SearchDocument}
|
||||||
*/
|
*/
|
||||||
public static SearchDocument from(Hit<?> hit, JsonpMapper jsonpMapper) {
|
public static SearchDocument from(Hit<?> hit, JsonpMapper jsonpMapper) {
|
||||||
|
|
||||||
Assert.notNull(hit, "hit must not be null");
|
Assert.notNull(hit, "hit must not be null");
|
||||||
|
|
||||||
Map<String, List<String>> highlightFields = hit.highlight();
|
Map<String, List<String>> highlightFields = hit.highlight();
|
||||||
|
|
||||||
Map<String, SearchDocumentResponse> innerHits = new LinkedHashMap<>();
|
Map<String, SearchDocumentResponse> innerHits = new LinkedHashMap<>();
|
||||||
hit.innerHits().forEach((name, innerHitsResult) -> {
|
hit.innerHits().forEach((name, innerHitsResult) -> {
|
||||||
// noinspection ReturnOfNull
|
// noinspection ReturnOfNull
|
||||||
innerHits.put(name, SearchDocumentResponseBuilder.from(innerHitsResult.hits(), null, null, null, 0, null, null,
|
innerHits.put(name, SearchDocumentResponseBuilder.from(innerHitsResult.hits(), null, null, null, null,
|
||||||
searchDocument -> null, jsonpMapper));
|
searchDocument -> null, jsonpMapper));
|
||||||
});
|
});
|
||||||
|
|
||||||
NestedMetaData nestedMetaData = from(hit.nested());
|
NestedMetaData nestedMetaData = from(hit.nested());
|
||||||
|
|
||||||
Explanation explanation = from(hit.explanation());
|
Explanation explanation = from(hit.explanation());
|
||||||
|
|
||||||
Map<String, Double> matchedQueries = hit.matchedQueries();
|
List<String> matchedQueries = hit.matchedQueries();
|
||||||
|
|
||||||
Function<Map<String, JsonData>, EntityAsMap> fromFields = fields -> {
|
Function<Map<String, JsonData>, EntityAsMap> fromFields = fields -> {
|
||||||
StringBuilder sb = new StringBuilder("{");
|
StringBuilder sb = new StringBuilder("{");
|
||||||
final boolean[] firstField = {true};
|
final boolean[] firstField = { true };
|
||||||
hit.fields().forEach((key, jsonData) -> {
|
hit.fields().forEach((key, jsonData) -> {
|
||||||
if (!firstField[0]) {
|
if (!firstField[0]) {
|
||||||
sb.append(',');
|
sb.append(',');
|
||||||
}
|
}
|
||||||
sb.append('"').append(key).append("\":") //
|
sb.append('"').append(key).append("\":") //
|
||||||
.append(jsonData.toJson(jsonpMapper).toString());
|
.append(jsonData.toJson(jsonpMapper).toString());
|
||||||
firstField[0] = false;
|
firstField[0] = false;
|
||||||
});
|
});
|
||||||
sb.append('}');
|
sb.append('}');
|
||||||
return new EntityAsMap().fromJson(sb.toString());
|
return new EntityAsMap().fromJson(sb.toString());
|
||||||
};
|
};
|
||||||
|
|
||||||
EntityAsMap hitFieldsAsMap = fromFields.apply(hit.fields());
|
EntityAsMap hitFieldsAsMap = fromFields.apply(hit.fields());
|
||||||
|
|
||||||
Map<String, List<Object>> documentFields = new LinkedHashMap<>();
|
Map<String, List<Object>> documentFields = new LinkedHashMap<>();
|
||||||
hitFieldsAsMap.forEach((key, value) -> {
|
hitFieldsAsMap.forEach((key, value) -> {
|
||||||
if (value instanceof List) {
|
if (value instanceof List) {
|
||||||
// noinspection unchecked
|
// noinspection unchecked
|
||||||
documentFields.put(key, (List<Object>) value);
|
documentFields.put(key, (List<Object>) value);
|
||||||
} else {
|
} else {
|
||||||
documentFields.put(key, Collections.singletonList(value));
|
documentFields.put(key, Collections.singletonList(value));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Document document;
|
Document document;
|
||||||
Object source = hit.source();
|
Object source = hit.source();
|
||||||
if (source == null) {
|
if (source == null) {
|
||||||
document = Document.from(hitFieldsAsMap);
|
document = Document.from(hitFieldsAsMap);
|
||||||
} else {
|
} else {
|
||||||
if (source instanceof EntityAsMap entityAsMap) {
|
if (source instanceof EntityAsMap entityAsMap) {
|
||||||
document = Document.from(entityAsMap);
|
document = Document.from(entityAsMap);
|
||||||
} else if (source instanceof JsonData jsonData) {
|
} else if (source instanceof JsonData jsonData) {
|
||||||
document = Document.from(jsonData.to(EntityAsMap.class));
|
document = Document.from(jsonData.to(EntityAsMap.class));
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (LOGGER.isWarnEnabled()) {
|
if (LOGGER.isWarnEnabled()) {
|
||||||
LOGGER.warn(String.format("Cannot map from type " + source.getClass().getName()));
|
LOGGER.warn(String.format("Cannot map from type " + source.getClass().getName()));
|
||||||
}
|
}
|
||||||
document = Document.create();
|
document = Document.create();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
document.setIndex(hit.index());
|
document.setIndex(hit.index());
|
||||||
document.setId(hit.id());
|
document.setId(hit.id());
|
||||||
|
|
||||||
if (hit.version() != null) {
|
if (hit.version() != null) {
|
||||||
document.setVersion(hit.version());
|
document.setVersion(hit.version());
|
||||||
}
|
}
|
||||||
document.setSeqNo(hit.seqNo() != null && hit.seqNo() >= 0 ? hit.seqNo() : -2); // -2 was the default value in the
|
document.setSeqNo(hit.seqNo() != null && hit.seqNo() >= 0 ? hit.seqNo() : -2); // -2 was the default value in the
|
||||||
// old client
|
// old client
|
||||||
document.setPrimaryTerm(hit.primaryTerm() != null && hit.primaryTerm() > 0 ? hit.primaryTerm() : 0);
|
document.setPrimaryTerm(hit.primaryTerm() != null && hit.primaryTerm() > 0 ? hit.primaryTerm() : 0);
|
||||||
|
|
||||||
float score = hit.score() != null ? hit.score().floatValue() : Float.NaN;
|
float score = hit.score() != null ? hit.score().floatValue() : Float.NaN;
|
||||||
return new SearchDocumentAdapter(document, score, hit.sort().stream().map(TypeUtils::toObject).toArray(),
|
return new SearchDocumentAdapter(document, score, hit.sort().stream().map(TypeUtils::toObject).toArray(),
|
||||||
documentFields, highlightFields, innerHits, nestedMetaData, explanation, matchedQueries, hit.routing());
|
documentFields, highlightFields, innerHits, nestedMetaData, explanation, matchedQueries, hit.routing());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SearchDocument from(CompletionSuggestOption<EntityAsMap> completionSuggestOption) {
|
public static SearchDocument from(CompletionSuggestOption<EntityAsMap> completionSuggestOption) {
|
||||||
|
|
||||||
Document document = completionSuggestOption.source() != null ? Document.from(completionSuggestOption.source())
|
Document document = completionSuggestOption.source() != null ? Document.from(completionSuggestOption.source())
|
||||||
: Document.create();
|
: Document.create();
|
||||||
document.setIndex(completionSuggestOption.index());
|
document.setIndex(completionSuggestOption.index());
|
||||||
|
|
||||||
if (completionSuggestOption.id() != null) {
|
if (completionSuggestOption.id() != null) {
|
||||||
document.setId(completionSuggestOption.id());
|
document.setId(completionSuggestOption.id());
|
||||||
}
|
}
|
||||||
|
|
||||||
float score = completionSuggestOption.score() != null ? completionSuggestOption.score().floatValue() : Float.NaN;
|
float score = completionSuggestOption.score() != null ? completionSuggestOption.score().floatValue() : Float.NaN;
|
||||||
return new SearchDocumentAdapter(document, score, new Object[]{}, Collections.emptyMap(), Collections.emptyMap(),
|
return new SearchDocumentAdapter(document, score, new Object[] {}, Collections.emptyMap(), Collections.emptyMap(),
|
||||||
Collections.emptyMap(), null, null, null, completionSuggestOption.routing());
|
Collections.emptyMap(), null, null, null, completionSuggestOption.routing());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static Explanation from(co.elastic.clients.elasticsearch.core.explain.@Nullable Explanation explanation) {
|
private static Explanation from(@Nullable co.elastic.clients.elasticsearch.core.explain.Explanation explanation) {
|
||||||
|
|
||||||
if (explanation == null) {
|
if (explanation == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
List<Explanation> details = explanation.details().stream().map(DocumentAdapters::from).collect(Collectors.toList());
|
List<Explanation> details = explanation.details().stream().map(DocumentAdapters::from).collect(Collectors.toList());
|
||||||
return new Explanation(true, (double) explanation.value(), explanation.description(), details);
|
return new Explanation(true, (double) explanation.value(), explanation.description(), details);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Explanation from(ExplanationDetail explanationDetail) {
|
private static Explanation from(ExplanationDetail explanationDetail) {
|
||||||
|
|
||||||
List<Explanation> details = explanationDetail.details().stream().map(DocumentAdapters::from)
|
List<Explanation> details = explanationDetail.details().stream().map(DocumentAdapters::from)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
return new Explanation(null, (double) explanationDetail.value(), explanationDetail.description(), details);
|
return new Explanation(null, (double) explanationDetail.value(), explanationDetail.description(), details);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static NestedMetaData from(@Nullable NestedIdentity nestedIdentity) {
|
private static NestedMetaData from(@Nullable NestedIdentity nestedIdentity) {
|
||||||
|
|
||||||
if (nestedIdentity == null) {
|
if (nestedIdentity == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
NestedMetaData child = from(nestedIdentity.nested());
|
NestedMetaData child = from(nestedIdentity.nested());
|
||||||
return NestedMetaData.of(nestedIdentity.field(), nestedIdentity.offset(), child);
|
return NestedMetaData.of(nestedIdentity.field(), nestedIdentity.offset(), child);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a {@link Document} from a {@link GetResponse} where the found document is contained as {@link EntityAsMap}.
|
* Creates a {@link Document} from a {@link GetResponse} where the found document is contained as {@link EntityAsMap}.
|
||||||
*
|
*
|
||||||
* @param getResponse the response instance
|
* @param getResponse the response instance
|
||||||
* @return the Document
|
* @return the Document
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public static Document from(GetResult<EntityAsMap> getResponse) {
|
public static Document from(GetResult<EntityAsMap> getResponse) {
|
||||||
|
|
||||||
Assert.notNull(getResponse, "getResponse must not be null");
|
Assert.notNull(getResponse, "getResponse must not be null");
|
||||||
|
|
||||||
if (!getResponse.found()) {
|
if (!getResponse.found()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Document document = getResponse.source() != null ? Document.from(getResponse.source()) : Document.create();
|
Document document = getResponse.source() != null ? Document.from(getResponse.source()) : Document.create();
|
||||||
document.setIndex(getResponse.index());
|
document.setIndex(getResponse.index());
|
||||||
document.setId(getResponse.id());
|
document.setId(getResponse.id());
|
||||||
|
|
||||||
if (getResponse.version() != null) {
|
if (getResponse.version() != null) {
|
||||||
document.setVersion(getResponse.version());
|
document.setVersion(getResponse.version());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getResponse.seqNo() != null) {
|
if (getResponse.seqNo() != null) {
|
||||||
document.setSeqNo(getResponse.seqNo());
|
document.setSeqNo(getResponse.seqNo());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getResponse.primaryTerm() != null) {
|
if (getResponse.primaryTerm() != null) {
|
||||||
document.setPrimaryTerm(getResponse.primaryTerm());
|
document.setPrimaryTerm(getResponse.primaryTerm());
|
||||||
}
|
}
|
||||||
|
|
||||||
return document;
|
return document;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a list of {@link MultiGetItem}s from a {@link MgetResponse} where the data is contained as
|
* Creates a list of {@link MultiGetItem}s from a {@link MgetResponse} where the data is contained as
|
||||||
* {@link EntityAsMap} instances.
|
* {@link EntityAsMap} instances.
|
||||||
*
|
*
|
||||||
* @param mgetResponse the response instance
|
* @param mgetResponse the response instance
|
||||||
* @return list of multiget items
|
* @return list of multiget items
|
||||||
*/
|
*/
|
||||||
public static List<MultiGetItem<Document>> from(MgetResponse<EntityAsMap> mgetResponse) {
|
public static List<MultiGetItem<Document>> from(MgetResponse<EntityAsMap> mgetResponse) {
|
||||||
|
|
||||||
Assert.notNull(mgetResponse, "mgetResponse must not be null");
|
Assert.notNull(mgetResponse, "mgetResponse must not be null");
|
||||||
|
|
||||||
return mgetResponse.docs().stream() //
|
return mgetResponse.docs().stream() //
|
||||||
.map(itemResponse -> MultiGetItem.of( //
|
.map(itemResponse -> MultiGetItem.of( //
|
||||||
itemResponse.isFailure() ? null : from(itemResponse.result()), //
|
itemResponse.isFailure() ? null : from(itemResponse.result()), //
|
||||||
ResponseConverter.getFailure(itemResponse)))
|
ResponseConverter.getFailure(itemResponse)))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2022-2025 the original author or authors.
|
* Copyright 2022-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -22,8 +22,8 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.jspecify.annotations.Nullable;
|
|
||||||
import org.springframework.data.elasticsearch.core.AggregationsContainer;
|
import org.springframework.data.elasticsearch.core.AggregationsContainer;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2022-2025 the original author or authors.
|
* Copyright 2022-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2022-2025 the original author or authors.
|
* Copyright 2022-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -19,12 +19,12 @@ import co.elastic.clients.elasticsearch.ElasticsearchClient;
|
|||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.jspecify.annotations.Nullable;
|
|
||||||
import org.springframework.beans.factory.DisposableBean;
|
import org.springframework.beans.factory.DisposableBean;
|
||||||
import org.springframework.beans.factory.FactoryBean;
|
import org.springframework.beans.factory.FactoryBean;
|
||||||
import org.springframework.beans.factory.FactoryBeanNotInitializedException;
|
import org.springframework.beans.factory.FactoryBeanNotInitializedException;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.data.elasticsearch.client.ClientConfiguration;
|
import org.springframework.data.elasticsearch.client.ClientConfiguration;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -46,9 +46,9 @@ import org.apache.http.protocol.HttpContext;
|
|||||||
import org.elasticsearch.client.RequestOptions;
|
import org.elasticsearch.client.RequestOptions;
|
||||||
import org.elasticsearch.client.RestClient;
|
import org.elasticsearch.client.RestClient;
|
||||||
import org.elasticsearch.client.RestClientBuilder;
|
import org.elasticsearch.client.RestClientBuilder;
|
||||||
import org.jspecify.annotations.Nullable;
|
|
||||||
import org.springframework.data.elasticsearch.client.ClientConfiguration;
|
import org.springframework.data.elasticsearch.client.ClientConfiguration;
|
||||||
import org.springframework.data.elasticsearch.support.HttpHeaders;
|
import org.springframework.data.elasticsearch.support.HttpHeaders;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -329,7 +329,7 @@ public final class ElasticsearchClients {
|
|||||||
Assert.notNull(jsonpMapper, "jsonpMapper must not be null");
|
Assert.notNull(jsonpMapper, "jsonpMapper must not be null");
|
||||||
|
|
||||||
TransportOptions.Builder transportOptionsBuilder = transportOptions != null ? transportOptions.toBuilder()
|
TransportOptions.Builder transportOptionsBuilder = transportOptions != null ? transportOptions.toBuilder()
|
||||||
: new RestClientOptions(RequestOptions.DEFAULT, false).toBuilder();
|
: new RestClientOptions(RequestOptions.DEFAULT).toBuilder();
|
||||||
|
|
||||||
RestClientOptions.Builder restClientOptionsBuilder = getRestClientOptionsBuilder(transportOptions);
|
RestClientOptions.Builder restClientOptionsBuilder = getRestClientOptionsBuilder(transportOptions);
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2021-2025 the original author or authors.
|
* Copyright 2021-2024 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -135,6 +135,6 @@ public abstract class ElasticsearchConfiguration extends ElasticsearchConfigurat
|
|||||||
* @return the options that should be added to every request. Must not be {@literal null}
|
* @return the options that should be added to every request. Must not be {@literal null}
|
||||||
*/
|
*/
|
||||||
public TransportOptions transportOptions() {
|
public TransportOptions transportOptions() {
|
||||||
return new RestClientOptions(RequestOptions.DEFAULT, false);
|
return new RestClientOptions(RequestOptions.DEFAULT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user