diff --git a/embedding-stores/langchain4j-community-typesense/pom.xml b/embedding-stores/langchain4j-community-typesense/pom.xml
new file mode 100644
index 00000000..ae46b7fe
--- /dev/null
+++ b/embedding-stores/langchain4j-community-typesense/pom.xml
@@ -0,0 +1,107 @@
+
+
+ 4.0.0
+
+ dev.langchain4j
+ langchain4j-community
+ 1.1.0-beta7-SNAPSHOT
+ ../../pom.xml
+
+
+ langchain4j-community-typesense
+ LangChain4j :: Community :: Integration :: Typesense
+
+
+
+ Apache-2.0
+ https://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+ A business-friendly OSS license
+
+
+
+
+ 1.3.0
+
+
+
+
+
+ dev.langchain4j
+ langchain4j-core
+ ${langchain4j.core.version}
+
+
+
+ org.typesense
+ typesense-java
+ ${typesense.version}
+
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+ dev.langchain4j
+ langchain4j-core
+ ${langchain4j.core.version}
+ tests
+ test-jar
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-params
+ test
+
+
+
+ org.assertj
+ assertj-core
+ test
+
+
+
+ org.tinylog
+ tinylog-impl
+ test
+
+
+
+ org.tinylog
+ slf4j-tinylog
+ test
+
+
+
+ dev.langchain4j
+ langchain4j-embeddings-all-minilm-l6-v2-q
+ test
+
+
+
+ org.testcontainers
+ typesense
+ test
+
+
+
+ org.awaitility
+ awaitility
+ test
+
+
+
+
+
diff --git a/embedding-stores/langchain4j-community-typesense/src/main/java/dev/langchain4j/community/store/embedding/typesense/TypesenseEmbeddingStore.java b/embedding-stores/langchain4j-community-typesense/src/main/java/dev/langchain4j/community/store/embedding/typesense/TypesenseEmbeddingStore.java
new file mode 100644
index 00000000..37df3779
--- /dev/null
+++ b/embedding-stores/langchain4j-community-typesense/src/main/java/dev/langchain4j/community/store/embedding/typesense/TypesenseEmbeddingStore.java
@@ -0,0 +1,293 @@
+package dev.langchain4j.community.store.embedding.typesense;
+
+import static dev.langchain4j.internal.Utils.getOrDefault;
+import static dev.langchain4j.internal.Utils.isNullOrEmpty;
+import static dev.langchain4j.internal.Utils.randomUUID;
+import static dev.langchain4j.internal.ValidationUtils.ensureNotEmpty;
+import static dev.langchain4j.internal.ValidationUtils.ensureNotNull;
+import static dev.langchain4j.internal.ValidationUtils.ensureTrue;
+import static java.util.Collections.singletonList;
+import static java.util.stream.Collectors.toList;
+
+import dev.langchain4j.community.store.embedding.typesense.exception.TypesenseException;
+import dev.langchain4j.data.document.Metadata;
+import dev.langchain4j.data.embedding.Embedding;
+import dev.langchain4j.data.segment.TextSegment;
+import dev.langchain4j.store.embedding.EmbeddingMatch;
+import dev.langchain4j.store.embedding.EmbeddingSearchRequest;
+import dev.langchain4j.store.embedding.EmbeddingSearchResult;
+import dev.langchain4j.store.embedding.EmbeddingStore;
+import dev.langchain4j.store.embedding.filter.Filter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.typesense.api.Client;
+import org.typesense.model.CollectionResponse;
+import org.typesense.model.DeleteDocumentsParameters;
+import org.typesense.model.ImportDocumentsParameters;
+import org.typesense.model.IndexAction;
+import org.typesense.model.MultiSearchCollectionParameters;
+import org.typesense.model.MultiSearchResult;
+import org.typesense.model.MultiSearchSearchesParameter;
+import org.typesense.model.SearchParameters;
+import org.typesense.model.SearchResult;
+import org.typesense.model.SearchResultHit;
+
+/**
+ * Represents a Typesense embedding store
+ *
+ * TODO: javadoc
+ */
+public class TypesenseEmbeddingStore implements EmbeddingStore {
+
+ private static final Logger log = LoggerFactory.getLogger(TypesenseEmbeddingStore.class);
+
+ private final Client client;
+ private final TypesenseSchema schema;
+ private final TypesenseMetadataFilterMapper metadataFilterMapper;
+
+ public TypesenseEmbeddingStore(Client client, TypesenseSchema schema) {
+ this.client = ensureNotNull(client, "client");
+ this.schema = getOrDefault(schema, TypesenseSchema.builder().build());
+ this.metadataFilterMapper = new TypesenseMetadataFilterMapper(schema);
+
+ String collectionName = this.schema.getCollectionName();
+ try {
+ if (!collectionExist(collectionName)) {
+ CollectionResponse response = client.collections().create(this.schema.getCollectionSchema());
+ log.debug("Created collection {}, response {}", collectionName, response);
+ }
+ } catch (Exception e) {
+ log.error("Error creating collection {}: {}", collectionName, e.getMessage());
+ throw new TypesenseException(String.format("Error creating collection %s", collectionName), e);
+ }
+ }
+
+ @Override
+ public String add(Embedding embedding) {
+ String id = randomUUID();
+ add(id, embedding);
+ return id;
+ }
+
+ @Override
+ public void add(String id, Embedding embedding) {
+ addInternal(id, embedding, null);
+ }
+
+ @Override
+ public String add(Embedding embedding, TextSegment textSegment) {
+ String id = randomUUID();
+ addInternal(id, embedding, textSegment);
+ return id;
+ }
+
+ @Override
+ public List addAll(List embeddings) {
+ List ids = embeddings.stream().map(ignored -> randomUUID()).collect(toList());
+ addAll(ids, embeddings, null);
+ return ids;
+ }
+
+ @Override
+ public void addAll(List ids, List embeddings, List embedded) {
+ ensureNotEmpty(ids, "ids");
+ ensureNotEmpty(embeddings, "embeddings");
+ ensureTrue(ids.size() == embeddings.size(), "ids size is not equal to embeddings size");
+ ensureTrue(
+ embedded == null || embeddings.size() == embedded.size(),
+ "embeddings size is not equal to embedded size");
+
+ List