{"id":14977733,"url":"https://github.com/redis/redis-om-spring","last_synced_at":"2026-02-20T20:03:50.911Z","repository":{"id":41052856,"uuid":"422442997","full_name":"redis/redis-om-spring","owner":"redis","description":"Spring Data Redis extensions for better search, documents models, and more","archived":false,"fork":false,"pushed_at":"2026-02-16T19:10:28.000Z","size":15626,"stargazers_count":646,"open_issues_count":38,"forks_count":102,"subscribers_count":20,"default_branch":"main","last_synced_at":"2026-02-16T23:38:32.633Z","etag":null,"topics":["java","redis","spring"],"latest_commit_sha":null,"homepage":"http://redis.github.io/redis-om-spring/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/redis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-10-29T04:36:55.000Z","updated_at":"2026-02-16T19:10:31.000Z","dependencies_parsed_at":"2022-07-14T06:40:33.131Z","dependency_job_id":"9493c5a3-bab3-450c-a744-8f2f79c3c5da","html_url":"https://github.com/redis/redis-om-spring","commit_stats":{"total_commits":539,"total_committers":33,"mean_commits":"16.333333333333332","dds":0.3283858998144712,"last_synced_commit":"a0a3b7c486d2d2c00492381a74ef4f1ae46a4a19"},"previous_names":[],"tags_count":47,"template":false,"template_full_name":null,"purl":"pkg:github/redis/redis-om-spring","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redis%2Fredis-om-spring","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redis%2Fredis-om-spring/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redis%2Fredis-om-spring/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redis%2Fredis-om-spring/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/redis","download_url":"https://codeload.github.com/redis/redis-om-spring/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redis%2Fredis-om-spring/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29662592,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-20T19:49:36.704Z","status":"ssl_error","status_checked_at":"2026-02-20T19:44:05.372Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","redis","spring"],"created_at":"2024-09-24T13:56:13.922Z","updated_at":"2026-02-20T20:03:50.894Z","avatar_url":"https://github.com/redis.png","language":"Java","readme":"\u003cdiv align=\"center\"\u003e\n  \u003cbr/\u003e\n  \u003cbr/\u003e\n  \u003cimg width=\"360\" src=\"docs/media/images/logo.svg\" alt=\"Redis OM\" /\u003e\n  \u003cbr/\u003e\n  \u003cbr/\u003e\n\u003c/div\u003e\n\n\u003cp\u003e\u003cp align=\"center\"\u003eObject Mapping (and more) for Redis!\u003c/p\u003e\u003c/p\u003e\n\n---\n\n**Redis OM Spring** extends [Spring Data Redis](https://spring.io/projects/spring-data-redis) to take full advantage of\n[Redis](https://redis.io/). Read the Official Docs 📕 here 👉🏽 [Redis OM Spring](https://redis.github.io/redis-om-spring/)\n\n| Stage                                             | Release                                      | Snapshot                                        | Coverage                                                                                                                                 | Issues                                                               | Resolution                                                                      | License                                  |\n|---------------------------------------------------|----------------------------------------------|-------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------|---------------------------------------------------------------------------------|------------------------------------------|\n| [![Project stage][badge-stage]][badge-stage-page] | [![Releases][badge-releases]][link-releases] | [![Snapshots][badge-snapshots]][link-snapshots] | [![codecov](https://codecov.io/gh/redis/redis-om-spring/graph/badge.svg?token=MBI8WSDM37)](https://codecov.io/gh/redis/redis-om-spring)  | [![Percentage of issues still open][badge-open-issues]][open-issues] | [![Average time to resolve an issue][badge-issue-resolution]][issue-resolution] | [![License][license-image]][license-url] |\n\nLearn / Discuss / Collaborate\n\n| Discord                                   | Twitch                                 | YouTube                                   | Twitter                                   |\n|-------------------------------------------|----------------------------------------|-------------------------------------------|-------------------------------------------|\n| [![Discord][discord-shield]][discord-url] | [![Twitch][twitch-shield]][twitch-url] | [![YouTube][youtube-shield]][youtube-url] | [![Twitter][twitter-shield]][twitter-url] |\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003eTable of contents\u003c/strong\u003e\u003c/summary\u003e\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n- [💡 Why Redis OM?](#-why-redis-om)\n- [🍀 Redis OM Spring](#-redis-om-spring)\n- [🏁 Getting Started](#-getting-started)\n  - [🚀 Launch Redis](#-launch-redis)\n  - [The SpringBoot App](#the-springboot-app)\n  - [💁‍♂️ The Mapped Model](#-the-mapped-model)\n  - [🧰 The Repository](#-the-repository)\n  - [🚤 Querying with Entity Streams](#-querying-with-entity-streams)\n    - [👭 Entity Meta-model](#-entity-meta-model)\n- [💻 Maven configuration](#-maven-configuration)\n  - [Official Releases](#official-releases)\n    - [Explicitly configuring OM as an annotation processor](#explicitly-configuring-om-as-an-annotation-processor)\n  - [Snapshots](#snapshots)\n- [🐘 Gradle configuration](#-gradle-configuration)\n  - [Add Repository - Snapshots Only](#add-repository---snapshots-only)\n  - [Dependency](#dependency)\n- [📚 Documentation](#-documentation)\n- [Demos](#demos)\n  - [Embedded Demos](#embedded-demos)\n  - [External Demos](#external-demos)\n- [⛏️ Troubleshooting](#-troubleshooting)\n- [✨ So How Do You Get RediSearch and RedisJSON?](#-so-how-do-you-get-redisearch-and-redisjson)\n- [💖 Contributing](#-contributing)\n- [🧑‍🤝‍🧑 Sibling Projects](#-sibling-projects)\n- [📝 License](#-license)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n\u003c/details\u003e\n\n## 💡 Why Redis OM?\n\nThe Redis OM family of client libraries provide high-level abstractions, idiomatically implemented for your language and\nplatform of choice. We currently cater to the Node, Python, .NET, and Spring communities.\n\n## 🍀 Redis OM Spring\n\nRedis OM Spring provides powerful repository and custom object-mapping abstractions built on top of the Spring Data\nRedis ([SDR](https://spring.io/projects/spring-data-redis)) framework.\n\nRedis OM Spring provides all Spring Data Redis capabilities, plus:\n\n- `@Document` annotation to map Spring Data models to Redis JSON documents\n- Enhancement to the Spring Data Redis `@RedisHash` via `@EnableRedisEnhancedRepositories`:\n  - uses Redis' native search engine (RediSearch) for secondary indexing\n  - uses [ULID](https://github.com/ulid/spec) for `@Id` annotated fields\n- `RedisDocumentRepository` with automatic implementation of Repository interfaces for complex querying capabilities\n  using `@EnableRedisDocumentRepositories`\n- Declarative search indexes via `@Indexed`\n- Full-text search indexes via `@Searchable`\n- **Dynamic index naming and multi-tenant support** with SpEL expressions and `RedisIndexContext`\n- **Index migration service** with Blue-Green, Dual-Write, and In-Place migration strategies\n- `EntityStream`s: Streams-based Query and Aggregations Builder\n- `@Bloom` annotation to determine very fast, with and with high degree of certainty, whether a value is in a\n  collection.\n- `@Vectorize` annotation to generate embeddings for text and images for use in Vector Similarity Searches\n- Vector Similarity Search API (See [Redis Stack Vectors](https://redis.io/docs/stack/search/reference/vectors/))\n\n\u003e [!IMPORTANT]\n\u003e ### 📋 Version Compatibility\n\u003e\n\u003e Choose the correct Redis OM Spring version for your Spring Boot version:\n\u003e\n\u003e | Redis OM Spring | Spring Boot | Java | Status |\n\u003e |-----------------|-------------|------|--------|\n\u003e | **1.0.x** | 3.4.x | 17+ | Maintenance |\n\u003e | **1.1.x** | 3.5.x | 17+ | Current Stable |\n\u003e | **2.0.x** | 4.0.x | 17+ | Latest |\n\u003e\n\u003e **Always use the Redis OM Spring version that matches your Spring Boot version.**\n\n## 🏁 Getting Started\n\nHere is a quick teaser of an application using Redis OM Spring to map a Spring Data model\nusing a RedisJSON document.\n\n### 🚀 Launch Redis\n\nRedis OM Spring relies on the search, query, and JSON capabilities of [Redis Stack](https://redis.io/docs/stack/).\nBefore writing any code, you'll need a Redis Stack. The quickest way to get\nthis is with Docker:\n\n```sh\ndocker run -p 6379:6379 -p 8001:8001 redis/redis-stack\n```\n\nThis launches [redis-stack](https://redis.io/docs/stack/), an extension of Redis that adds several modern data\nstructures to Redis. You'll also notice that if you open up `http://localhost:8001`, you'll have access to the\nredis-insight GUI, a GUI you can use to visualize and work with your data in Redis.\nWe have also provided a Docker Compose YAML file for you to quickly get started\nusing [Redis Stack](https://redis.io/docs/stack/).\n\nTo launch the docker compose application, on the command line (or via Docker Desktop), clone this repository and run\n(from the root folder):\n\n```bash\ndocker compose up\n```\n\n### Configuring your Redis Connection\n\nBy default, Redis OM Spring connects to `localhost` at port `6379`. If\nyour instance is running somewhere else, you can configure the connection\nin your `application.properties` or `application.yaml`:\n\nIn `application.properties`:\n\n```\nspring.data.redis.host=your.cloud.db.redislabs.com\nspring.data.redis.port=12345\nspring.data.redis.password=xxxxxxxx\nspring.data.redis.username=default\n```\n\nIn `application.yaml`:\n\n```\nspring:\n  data:\n    redis:\n      host: your.cloud.db.redislabs.com\n      port: 12345\n      password: xxxxxxxx\n      username: default\n```\n\n### The SpringBoot App\n\nUse the `@EnableRedisDocumentRepositories` annotation to scan for `@Document` annotated Spring models,\nInject repositories beans implementing `RedisDocumentRepository` which you can use for CRUD operations and custom\nqueries (all by declaring Spring Data Query Interfaces):\n\n```java\npackage com.redis.om.documents;\n\nimport java.util.Set;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.geo.Point;\n\nimport com.redis.om.documents.domain.Company;\nimport com.redis.om.documents.repositories.CompanyRepository;\n\n@SpringBootApplication\n@Configuration\n@EnableRedisDocumentRepositories(basePackages = \"com.redis.om.documents.*\")\npublic class RomsDocumentsApplication {\n\n  @Autowired\n  CompanyRepository companyRepo;\n\n  @Bean\n  CommandLineRunner loadTestData() {\n    return args -\u003e {\n      // remove all companies\n      companyRepo.deleteAll();\n\n      // Create a couple of `Company` domain entities\n      Company redis = Company.of(\n        \"Redis\", \"https://redis.com\", new Point(-122.066540, 37.377690), 526, 2011 //\n      );\n      redis.setTags(Set.of(\"fast\", \"scalable\", \"reliable\"));\n\n      Company microsoft = Company.of(\n        \"Microsoft\", \"https://microsoft.com\", new Point(-122.124500, 47.640160), 182268, 1975 //\n      );\n      microsoft.setTags(Set.of(\"innovative\", \"reliable\"));\n\n      // save companies to the database\n      companyRepo.save(redis);\n      companyRepo.save(microsoft);\n    };\n  }\n\n  public static void main(String[] args) {\n    SpringApplication.run(RomsDocumentsApplication.class, args);\n  }\n}\n```\n\n### 💁‍♂️ The Mapped Model\n\nLike many other Spring Data projects, an annotation at the class level determines how instances\nof the class are persisted. Redis OM Spring provides the `@Document` annotation to persist models as JSON documents\nusing RedisJSON:\n\n```java\npackage com.redis.om.documents.domain;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\nimport org.springframework.data.annotation.Id;\nimport org.springframework.data.geo.Point;\nimport com.redis.om.spring.annotations.Document;\nimport com.redis.om.spring.annotations.Searchable;\nimport lombok.*;\n\n@Data\n@NoArgsConstructor\n@RequiredArgsConstructor(staticName = \"of\")\n@AllArgsConstructor(access = AccessLevel.PROTECTED)\n@Document\npublic class Company {\n  @Id private String id;\n  @Searchable private String name;\n  @Indexed private Point location;\n  @Indexed private Set\u003cString\u003e tags = new HashSet\u003c\u003e();\n  @Indexed private Integer numberOfEmployees;\n  @Indexed private Integer yearFounded;\n  private String url;\n  private boolean publiclyListed;\n\n  // ...\n}\n```\n\nFor **multi-tenant applications**, you can use dynamic index naming with SpEL expressions:\n\n```java\n// Dynamic index naming for multi-tenant support\n@Document\n@IndexingOptions(indexName = \"#{@environment.getProperty('app.tenant')}_companies_idx\")\npublic class Company {\n  @Id private String id;\n  @Searchable private String name;\n  // other fields...\n}\n```\n\nRedis OM Spring, replaces the conventional `UUID` primary key strategy generation with a `ULID` (Universally Unique\nLexicographically Sortable Identifier) which is faster to generate and easier on the eyes.\n\n### 🧰 The Repository\n\nRedis OM Spring data repository's goal, like other Spring Data repositories, is to significantly reduce the amount of\nboilerplate code required to implement data access. Simply create a Java interface\nthat extends `RedisDocumentRepository` that takes the domain class to manage as well as the ID type of the domain class\nas type arguments. `RedisDocumentRepository` extends the Spring Data class `PagingAndSortingRepository`.\n\nDeclare query methods on the interface. You can both, expose CRUD methods or create declarations for complex queries\nthat Redis OM Spring will fulfill at runtime:\n\n```java\npackage com.redis.om.documents.repositories;\n\nimport java.util.*;\n\nimport org.springframework.data.geo.Distance;\nimport org.springframework.data.geo.Point;\nimport org.springframework.data.repository.query.Param;\n\nimport com.redis.om.documents.domain.Company;\nimport com.redis.om.spring.annotations.Query;\nimport com.redis.om.spring.repository.RedisDocumentRepository;\n\npublic interface CompanyRepository extends RedisDocumentRepository\u003cCompany, String\u003e {\n  // find one by property\n  Optional\u003cCompany\u003e findOneByName(String name);\n\n  // geospatial query\n  Iterable\u003cCompany\u003e findByLocationNear(Point point, Distance distance);\n\n  // find by tag field, using JRediSearch \"native\" annotation\n  @Query(\"@tags:{$tags}\")\n  Iterable\u003cCompany\u003e findByTags(@Param(\"tags\") Set\u003cString\u003e tags);\n\n  // find by numeric property\n  Iterable\u003cCompany\u003e findByNumberOfEmployees(int noe);\n\n  // find by numeric property range\n  Iterable\u003cCompany\u003e findByNumberOfEmployeesBetween(int noeGT, int noeLT);\n\n  // starting with/ending with\n  Iterable\u003cCompany\u003e findByNameStartingWith(String prefix);\n}\n```\n\nThe repository proxy has two ways to derive a store-specific query from the method name:\n\n- By deriving the query from the method name directly.\n- By using a manually defined query using the `@Query` or `@Aggregation` annotations.\n\n### 🚤 Querying with Entity Streams\n\nRedis OM Spring Entity Streams provides a Java 8 Streams interface to Query Redis JSON documents using RediSearch.\nEntity Streams allow you to process data in a type safe declarative way similar to SQL statements. Streams can be used\nto express a query as a chain of operations.\n\nEntity Streams in Redis OM Spring provides the same semantics as Java 8 streams. Streams can be made of Redis Mapped\nentities (`@Document`) or one or more properties of an Entity. Entity Streams progressively build the query until a\nterminal operation is invoked (such as `collect`). Whenever a Terminal operation is applied to a Stream, the Stream\ncannot accept additional operations to its pipeline and it also means that the Stream is started.\n\nLet's start with a simple example, a Spring `@Service` which includes `EntityStream` to query for instances of the\nmapped class `Person`:\n\n```java\npackage com.redis.om.skeleton.services;\n\nimport java.util.stream.Collectors;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport com.redis.om.skeleton.models.Person;\nimport com.redis.om.skeleton.models.Person$;\nimport com.redis.om.spring.search.stream.EntityStream;\n\n@Service\npublic class PeopleService {\n  @Autowired\n  EntityStream entityStream;\n\n  // Find all people\n  public Iterable\u003cPerson\u003e findAllPeople() {\n    return entityStream //\n        .of(Person.class) //\n        .collect(Collectors.toList());\n  }\n\n}\n```\n\nThe `EntityStream` is injected into the `PeopleService` using `@Autowired`. We can then get a stream for `Person`\nobjects by using `entityStream.of(Person.class)`. At this point the stream represents the equivalent of\na `SELECT * FROM Person` on a relational database. The call to `collect` will then execute the underlying query and\nreturn a collection of all `Person` objects in Redis.\n\n#### 👭 Entity Meta-model\n\nTo produce more elaborate queries, you're provided with a generated metamodel, which is a class with the same name as\nyour model but ending with a dollar sign. In the\nexample below, our entity model is `Person` therefore we get a metamodel named `Person$`. With the metamodel you have\naccess to the operations related to the\nunderlying search engine field. For example, in the example we have an `age` property which is an integer. Therefore,\nour metamodel has an `AGE` property which has\nnumeric operations we can use with the stream's `filter` method such as `between`.\n\n```java\n// Find people by age range\npublic Iterable\u003cPerson\u003e findByAgeBetween(int minAge, int maxAge) {\n  return entityStream //\n      .of(Person.class) //\n      .filter(Person$.AGE.between(minAge, maxAge)) //\n      .sorted(Person$.AGE, SortOrder.ASC) //\n      .collect(Collectors.toList());\n}\n```\n\nIn this example we also make use of the Streams `sorted` method to declare that our stream will be sorted by\nthe `Person$.AGE` in `ASC`ending order.\n\nCheck out the full set of tests\nfor [EntityStreams](https://github.com/redis/redis-om-spring/tree/main/redis-om-spring/src/test/java/com/redis/om/spring/search/stream)\n\n### 👯‍️ Querying by Example (QBE)\n\nQuery by Example (QBE) is a user-friendly querying technique with a simple interface. It allows dynamic query creation\nand does not require you to write queries that contain field names. In fact, Query by Example does not require you to\nwrite queries by using store-specific query languages at all.\n\n#### QBE Usage\n\nThe Query by Example API consists of four parts:\n\n- **Probe**: The actual example of a domain object with populated fields.\n- **ExampleMatcher**: The `ExampleMatcher` carries details on how to match particular fields. It can be reused across\n  multiple `Examples`.\n- **Example**: An Example consists of the probe and the ExampleMatcher. It is used to create the query.\n- **FetchableFluentQuery**: A `FetchableFluentQuery` offers a fluent API, that allows further customization of a query\n  derived from an `Example`.\n  Using the fluent API lets you specify ordering projection and result processing for your query.\n\nQuery by Example is well suited for several use cases:\n\n- Querying your data store with a set of static or dynamic constraints.\n- Frequent refactoring of the domain objects without worrying about breaking existing queries.\n- Working independently of the underlying data store API.\n\nFor example, if you have an `@Document` or `@RedisHash` annotated entity you can create an instance, partially populate\nits\nproperties, create an `Example` from it, and used the `findAll` method to query for similar entities:\n\n```java\nMyDoc template = new MyDoc();\ntemplate.setTitle(\"hello world\");\ntemplate.setTag(Set.of(\"artigo\"));\n\nExample\u003cMyDoc\u003e example = Example.of(template, ExampleMatcher.matchingAny());\n\nIterable\u003cMyDoc\u003e allMatches = repository.findAll(example);\n```\n\n## 💻 Maven configuration\n\n### Official Releases\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.redis.om\u003c/groupId\u003e\n  \u003cartifactId\u003eredis-om-spring\u003c/artifactId\u003e\n  \u003cversion\u003e${version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n#### Release Process\n\nTo release a new version of Redis OM Spring follow `docs/release_process.md`.\nThis process publishes both `redis-om-spring` and `redis-om-spring-ai` modules to Maven Central.\n\n\u003e ⚠️ Starting from version `v1.0.0-RC.1`, Redis OM Spring has been divided into two separate modules:\n\u003e\n\u003e - **Redis OM Spring** – providing modeling and vector indexing capabilities;\n\u003e - **Redis OM Spring AI** – introducing AI capabilities, powered by Spring AI, to automatically generate vector embeddings using popular providers like OpenAI, Azure, Ollama, VertexAI, and more.\n\nTo use **Redis OM** for modeling your domain objects, indexing them, and enabling both querying and Vector Similarity Search features, simply include the dependency for **Redis OM Spring** as shown below:\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.redis.om\u003c/groupId\u003e\n  \u003cartifactId\u003eredis-om-spring\u003c/artifactId\u003e\n  \u003cversion\u003e${version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nTo enable AI capabilities like automatically converting (un)structured data into vector embeddings and interacting with embedding providers, simply add the dependency for **Redis OM Spring AI** as shown below:\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.redis.om\u003c/groupId\u003e\n  \u003cartifactId\u003eredis-om-spring-ai\u003c/artifactId\u003e\n  \u003cversion\u003e${version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nThis will unlock powerful AI-driven features for your applications, making data processing and retrieval smarter and more efficient.\n\n#### Explicitly configuring OM as an annotation processor\n\nFor Maven, things normally just work, when you run `./mvnw spring-boot:run`. Some users have experienced this not being\nthe case, in which I recommend to explicitly declaring the `maven-compiler-plugin` in the case below it is paired with\nan app created with [`start.spring.io`](https://start.spring.io/) with Spring Boot `v4.0.0` (all other versions can be\ninherited from the parent poms):\n\n```xml\n\u003cplugin\u003e\n  \u003cgroupId\u003eorg.apache.maven.plugins\u003c/groupId\u003e\n  \u003cartifactId\u003emaven-compiler-plugin\u003c/artifactId\u003e\n  \u003cversion\u003e${maven-compiler-plugin.version}\u003c/version\u003e\n  \u003cconfiguration\u003e\n    \u003cannotationProcessorPaths\u003e\n      \u003cpath\u003e\n        \u003cgroupId\u003eorg.springframework.boot\u003c/groupId\u003e\n        \u003cartifactId\u003espring-boot-configuration-processor\u003c/artifactId\u003e\n        \u003cversion\u003e4.0.0\u003c/version\u003e\n      \u003c/path\u003e\n      \u003cpath\u003e\n        \u003cgroupId\u003eorg.projectlombok\u003c/groupId\u003e\n        \u003cartifactId\u003elombok\u003c/artifactId\u003e\n        \u003cversion\u003e${lombok.version}\u003c/version\u003e\n      \u003c/path\u003e\n      \u003cpath\u003e\n        \u003cgroupId\u003ecom.redis.om\u003c/groupId\u003e\n        \u003cartifactId\u003eredis-om-spring\u003c/artifactId\u003e\n        \u003cversion\u003e2.0.0\u003c/version\u003e\n      \u003c/path\u003e\n    \u003c/annotationProcessorPaths\u003e\n  \u003c/configuration\u003e\n\u003c/plugin\u003e\n```\n\n### Snapshots\n\n```xml\n  \u003crepositories\u003e\n    \u003crepository\u003e\n      \u003cid\u003esnapshots-repo\u003c/id\u003e\n      \u003curl\u003ehttps://s01.oss.sonatype.org/content/repositories/snapshots/\u003c/url\u003e\n    \u003c/repository\u003e\n  \u003c/repositories\u003e\n```\n\nand\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.redis.om\u003c/groupId\u003e\n  \u003cartifactId\u003eredis-om-spring\u003c/artifactId\u003e\n  \u003cversion\u003e${version}-SNAPSHOT\u003c/version\u003e\n\u003c/dependency\u003e\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.redis.om\u003c/groupId\u003e\n  \u003cartifactId\u003eredis-om-spring-ai\u003c/artifactId\u003e\n  \u003cversion\u003e${version}-SNAPSHOT\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n**Ready to learn more?** Check out the [getting started](docs/getting_started.md) guide.\n\n## 🐘 Gradle configuration\n\n### Add Repository - Snapshots Only\n\n```groovy\nrepositories {\n    mavenCentral()\n    maven {\n        url 'https://s01.oss.sonatype.org/content/repositories/snapshots/'\n    }\n}\n```\n\n### Dependency\n\n```groovy\next {\n  redisOmVersion = '1.0.0-RC.1'\n}\n\ndependencies {\n  implementation \"com.redis.om:redis-om-spring:$redisOmVersion\"\n  implementation \"com.redis.om:redis-om-spring-ai:$redisOmVersion\"\n  annotationProcessor \"com.redis.om:redis-om-spring:$redisOmVersion\"\n}\n```\n\n## 📚 Documentation\n\nThe Redis OM Spring documentation is available at:\n\n- [Local Documentation](docs/index.md)\n- [Online Documentation](https://redis.github.io/redis-om-spring/) (Generated from the main branch)\n\n## Demos\n\n### Embedded Demos\n\nThese can be found in the `/demos` folder:\n\n- **roms-documents**:\n  - Simple API example of `@Document` mapping, Spring Repositories and Querying.\n  - Run with  `./gradlew :demos:roms-documents:bootRun`\n\n- **roms-hashes**:\n  - Simple API example of `@RedisHash`, enhanced secondary indices and querying.\n  - Run with  `./gradlew :demos:roms-hashes:bootRun`\n\n- **roms-permits**:\n  - Port of [Elena Kolevska's](https://github.com/elena-kolevska) Quick Start: Using RediSearch with\n    JSON [Demo][redisearch-json] to Redis OM Spring.\n  - Run with  `./gradlew :demos:roms-permits:bootRun`\n\n- **roms-vss**:\n  - Port of [Redis Vector Search Demo](https://github.com/redis-developer/redis-product-search) for fashion product recommendations using vector similarity search.\n  - Run with  `./gradlew :demos:roms-vss:bootRun`\n\n- **roms-vss-movies**:\n  - Movie recommendation system showcasing Redis 8's vector similarity search capabilities.\n  - Run with  `./gradlew :demos:roms-vss-movies:bootRun`\n\n- **roms-modeling**:\n  - Simple API example of modeling, Spring Repositories and Querying.\n  - Run with  `./gradlew :demos:roms-modeling:bootRun`\n\n- **roms-vectorizers**:\n  - Simple API example of vectorizing, Spring Repositories and Querying.\n  - Run with  `./gradlew :demos:roms-vectorizer:bootRun`\n\n- **roms-amr-entraid**:\n  - Demo showing how to connect to Azure Managed Redis (AMR) using Microsoft Entra ID authentication.\n  - Run with  `./gradlew :demos:roms-amr-entraid:bootRun`\n\n### External Demos\n\n- **redis-om-spring-skeleton-app**:\n  - Redis OM Spring Skeleton App\n  - Repo: \u003chttps://github.com/redis-developer/redis-om-spring-skeleton-app\u003e\n\n- **redis-om-spring-react-todomvc**:\n  - Redis OM Spring to build a RESTful API that satisfies the simple web API spec set by\n    the Todo-Backend project using JSON Documents stored in Redis.\n  - Repo: \u003chttps://github.com/redis-developer/redis-om-spring-react-todomvc\u003e\n\n- **redis-om-autocomplete-demo**:\n  - A Spring Boot demo of autocomplete functionality using Redis OM Spring.\n  - Repo: \u003chttps://github.com/redis-developer/redis-om-autocomplete-demo\u003e\n\n## ⛏️ Troubleshooting\n\nIf you run into trouble or have any questions, we're here to help!\n\nFirst, check the [FAQ](docs/faq.md). If you don't find the answer there,\nhit us up on the [Redis Discord Server](http://discord.gg/redis).\n\n## ✨ So How Do You Get RediSearch and RedisJSON?\n\nRedis OM relies on two source available Redis modules: [RediSearch][redisearch-url] and [RedisJSON][redis-json-url].\n\nYou can run these modules in your self-hosted Redis deployment, or you can use [Redis Enterprise][redis-enterprise-url],\nwhich includes both modules.\n\nTo learn more, read [our documentation](docs/redis_modules.md).\n\n## 💖 Contributing\n\nWe'd love your contributions!\n\n**Bug reports** are especially helpful at this stage of the\nproject. [You can open a bug report on GitHub](https://github.com/redis-om/redis-om-spring/issues/new).\n\nYou can also **contribute documentation** -- or just let us know if something needs more\ndetail. [Open an issue on GitHub](https://github.com/redis-om/redis-om-spring/issues/new) to get started.\n\n### Code Style\n\nThis project uses the Spotless Gradle plugin with Eclipse formatter to enforce a consistent code style. Before submitting a pull request, please make sure your code follows our formatting guidelines by running:\n\n```bash\n./gradlew spotlessApply\n```\n\nThis will automatically reformat your code to match the project's style. You can also check if your code meets the formatting requirements without changing it:\n\n```bash\n./gradlew spotlessCheck\n```\n\nThe main formatting rules include:\n\n- 2-space indentation (not 4)\n- KNR brace style (braces at end of line)\n- Maximum line length of 120 characters\n- Consistent import ordering (java, javax, org, com, other imports)\n\n## 🧑‍🤝‍🧑 Sibling Projects\n\n- [Redis OM Node.js](https://github.com/redis/redis-om-node)\n- [Redis OM Python](https://github.com/redis/redis-om-python)\n- [Redis OM .NET](https://github.com/redis/redis-om-dotnet)\n\n## 📝 License\n\nRedis OM uses the [MIT license][license-url].\n\n\u003c!-- Badges / Shields --\u003e\n\n[badge-stage]: https://img.shields.io/badge/Project%20Stage-Development-green.svg\n\n[badge-stage-page]: https://github.com/redis/redis-om-spring/wiki/Project-Stages\n\n[badge-snapshots]: https://img.shields.io/nexus/s/https/s01.oss.sonatype.org/com.redis.om/redis-om-spring.svg\n\n[badge-releases]: https://img.shields.io/maven-central/v/com.redis.om/redis-om-spring\n\n[badge-open-issues]: http://isitmaintained.com/badge/open/redis/redis-om-spring.svg\n\n[badge-issue-resolution]: http://isitmaintained.com/badge/resolution/redis/redis-om-spring.svg\n\n[license-image]: https://img.shields.io/github/license/redis/redis-om-spring\n\n[license-url]: LICENSE\n\n[discord-shield]: https://img.shields.io/discord/697882427875393627?style=social\u0026logo=discord\n\n[twitch-shield]: https://img.shields.io/twitch/status/redisinc?style=social\n\n[twitter-shield]: https://img.shields.io/twitter/follow/redisinc?style=social\n\n[youtube-shield]: https://img.shields.io/youtube/channel/views/UCD78lHSwYqMlyetR0_P4Vig?style=social\n\n\u003c!-- Links --\u003e\n\n[redisearch-url]: https://redis.io/search/\n\n[redis-json-url]: https://redis.io/json/\n\n[redis-enterprise-url]: https://redis.com/try-free/\n\n[link-snapshots]: https://s01.oss.sonatype.org/content/repositories/snapshots/com/redis/om/redis-om-spring/\n\n[link-releases]: https://repo1.maven.org/maven2/com/redis/om/redis-om-spring/\n\n[open-issues]: http://isitmaintained.com/project/redis/redis-om-spring\n\n[issue-resolution]: http://isitmaintained.com/project/redis/redis-om-spring\n\n[redisearch-json]: https://github.com/redislabs-training/mod-devcap-redisjson-getting-started/blob/master/articles/QuickStart-RediSearchWithJSON.md\n\n[discord-url]: http://discord.gg/redis\n\n[twitch-url]: https://www.twitch.tv/redisinc\n\n[twitter-url]: https://twitter.com/redisinc\n\n[youtube-url]: https://www.youtube.com/redisinc\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fredis%2Fredis-om-spring","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fredis%2Fredis-om-spring","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fredis%2Fredis-om-spring/lists"}