OpenSearch
Maven Dependency
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-opensearch</artifactId>
<version>1.10.0-beta18</version>
</dependency>
APIs
The OpenSearchEmbeddingStore uses exact k-NN with scoring script implementation for similarity search.
See OpenSearch k-NN documentation for more details.
Features
- Metadata filtering: Supports filtering search results by metadata using the
FilterAPI - Removal operations:
- Remove embeddings by ID
- Remove embeddings by metadata filter
- Remove all embeddings (drops the index)
- AWS Support: Native support for Amazon OpenSearch Service and Amazon OpenSearch Serverless
Basic Usage
To create the OpenSearchEmbeddingStore instance for local or network-reachable OpenSearch:
OpenSearchEmbeddingStore store = OpenSearchEmbeddingStore.builder()
.serverUrl("http://localhost:9200")
.indexName("my-embeddings")
.build();
With authentication:
OpenSearchEmbeddingStore store = OpenSearchEmbeddingStore.builder()
.serverUrl("https://my-opensearch.example.com:9200")
.userName("admin")
.password("admin")
.indexName("my-embeddings")
.build();
AWS OpenSearch
For Amazon OpenSearch Service or OpenSearch Serverless:
AwsSdk2TransportOptions options = AwsSdk2TransportOptions.builder()
.setCredentials(DefaultCredentialsProvider.create())
.build();
OpenSearchEmbeddingStore store = OpenSearchEmbeddingStore.builder()
.serverUrl("https://search-domain.us-east-1.es.amazonaws.com")
.serviceName("es") // or "aoss" for Serverless
.region("us-east-1")
.options(options)
.indexName("my-embeddings")
.build();
Metadata Filtering
Filter search results by metadata:
Filter filter = metadataKey("category").isEqualTo("documentation");
EmbeddingSearchRequest searchRequest = EmbeddingSearchRequest.builder()
.queryEmbedding(queryEmbedding)
.filter(filter)
.maxResults(10)
.build();
EmbeddingSearchResult<TextSegment> result = store.search(searchRequest);
Supported filter operations:
- Comparison:
isEqualTo,isNotEqualTo,isGreaterThan,isGreaterThanOrEqualTo,isLessThan,isLessThanOrEqualTo - Collection:
isIn,isNotIn - Logical:
and,or,not
Removal Operations
Remove embeddings by ID:
store.removeAll(List.of("id1", "id2", "id3"));
Remove embeddings by metadata filter:
Filter filter = metadataKey("status").isEqualTo("archived");
store.removeAll(filter);
Remove all embeddings (drops the index):
store.removeAll();