Elasticsearch
Maven 依赖
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-elasticsearch</artifactId>
<version>1.18.1-beta28</version>
</dependency>
概述
langchain4j-elasticsearch 模块提供了将 Elasticsearch 作为嵌入存储与内容
检索器的集成。
它包含两个主要类:
ElasticsearchEmbeddingStore:EmbeddingStore接口的实现, 使用 Elasticsearch 存储和检索嵌入。ElasticsearchContentRetriever:ContentRetriever接口的实现,使用 Elasticsearch 基于向量相似度搜索检索相关文档。
这两个类都需要一个 Elasticsearch Client 来连接 Elasticsearch 服务器。
String apiKey = "VnVhQ2ZHY0JDZGJrU...";
ElasticsearchClient client = ElasticsearchClient.of(ec -> ec
.host("https://localhost:9200")
.apiKey(apiKey));
注意:
关于如何创建 ElasticsearchClient 实例,请参阅 Elasticsearch 文档。
ElasticsearchEmbeddingStore
要创建 ElasticsearchEmbeddingStore 实例,需要提供一个 ElasticsearchClient:
ElasticsearchEmbeddingStore store = ElasticsearchEmbeddingStore.builder()
.client(client)
.build();
它支持以下选项:
indexName:要使用的 Elasticsearch 索引名称。默认值为default。configuration:要使用的ElasticsearchConfiguration。默认值为ElasticsearchConfigurationKnn。
上面的代码等价于:
ElasticsearchEmbeddingStore store = ElasticsearchEmbeddingStore.builder()
.client(client)
.configuration(ElasticsearchConfigurationKnn.builder().build())
.indexName("default")
.build();
ElasticsearchContentRetriever
ContentRetriever 需要一个嵌入模型:
EmbeddingModel embeddingModel = new AllMiniLmL6V2QuantizedEmbeddingModel();
要创建 ElasticsearchContentRetriever 实例,需要提供 ElasticsearchClient 和
EmbeddingModel:
ElasticsearchContentRetriever contentRetriever = ElasticsearchContentRetriever.builder()
.client(client)
.embeddingModel(embeddingModel)
.build();
它支持以下选项:
configuration:要使用的ElasticsearchConfiguration(参见下文)。默认值为ElasticsearchConfigurationKnn。indexName:要使用的 Elasticsearch 索引名称。默认值为default。若索引不存在, 将自动创建。maxResults:检索结果的最大数量。默认值为3。minScore:检索结果的最低分数阈值。默认值为0.0。filter:检索时应用的Filter(如有)。默认值为null。
上面的代码等价于:
ElasticsearchContentRetriever contentRetriever = ElasticsearchContentRetriever.builder()
.client(client)
.embeddingModel(embeddingModel)
.configuration(ElasticsearchConfigurationKnn.builder().build())
.indexName("default")
.maxResults(3)
.minScore(0.0)
.filter(null)
.build();
ElasticsearchConfiguration
ElasticsearchConfiguration 定义了嵌入存储或内容检索器如何与
Elasticsearch 服务器交互。你可以通过实现 ElasticsearchConfiguration 接口创建自定义配置,
也可以使用以下已提供的实现之一:
ElasticsearchConfigurationKnn:使用近似 kNN 查询 (默认)。ElasticsearchConfigurationScript:使用 scriptScore 查询。 请注意,该实现使用余弦相似度。ElasticsearchConfigurationFullText:使用全文搜索 (仅适用于内容检索器)。ElasticsearchConfigurationHybrid:使用混合搜索 (仅适用于内容检索器,需要付费许可证)。它将 kNN 向量查询与全文查询相结合。
要创建配置实例,可以使用各实现提供的 builder。例如:
ElasticsearchConfiguration configuration = ElasticsearchConfigurationKnn.builder().build();
ElasticsearchConfigurationKnn
ElasticsearchConfigurationKnn 使用近似 kNN 查询执行向量相似度搜索。
它是 ElasticsearchEmbeddingStore
和 ElasticsearchContentRetriever 使用的默认配置。
要创建实例,可以使用 builder:
ElasticsearchConfiguration configuration = ElasticsearchConfigurationKnn.builder().build();
它支持以下选项:
numCandidates:搜索期间要考虑的候选邻居数量。默认值为null,表示使用 Elasticsearch 的默认值。includeVectorResponse:是否在搜索响应中包含向量字段。默认值为false。
注意: 从 Elasticsearch 服务器 9.2 版本起,向量字段默认从响应中排除。若要在响应中包含 向量字段(不推荐),请在 builder 中设置
includeVectorResponse:ElasticsearchConfigurationKnn configuration = ElasticsearchConfigurationKnn.builder()
.includeVectorResponse(true)
.build();
ElasticsearchConfigurationScript
ElasticsearchConfigurationScript 使用 scriptScore 查询执行向量相似度搜索。请注意,该
实现使用余弦相似度。
它同时适用于 ElasticsearchEmbeddingStore
和 ElasticsearchContentRetriever。
要创建实例,可以使用 builder:
ElasticsearchConfiguration configuration = ElasticsearchConfigurationScript.builder().build();
它支持以下选项:
includeVectorResponse:是否在搜索响应中包含向量字段。默认值为false。
注意: 从 Elasticsearch 服务器 9.2 版本起,向量字段默认从响应中排除。若要在响应中包含 向量字段(不推荐),请在 builder 中设置
includeVectorResponse:ElasticsearchConfiguration configuration = ElasticsearchConfigurationScript.builder()
.includeVectorResponse(true)
.build();
ElasticsearchConfigurationFullText
ElasticsearchConfigurationFullText 使用全文搜索检索相关文档。
它仅适用于 ElasticsearchContentRetriever。
要创建实例,可以使用 builder:
ElasticsearchConfiguration configuration = ElasticsearchConfigurationFullText.builder().build();
ElasticsearchConfigurationHybrid
ElasticsearchConfigurationHybrid 使用混合搜索,将 kNN 向量查询与全文查询相结合。请注意,
混合搜索需要 Elasticsearch 企业许可证或试用许可证。
它仅适用于 ElasticsearchContentRetriever。
要创建实例,可以使用 builder:
ElasticsearchConfiguration configuration = ElasticsearchConfigurationHybrid.builder().build();
它支持以下选项:
numCandidates:搜索期间要考虑的候选邻居数量。默认值为null,表示使用 Elasticsearch 的默认值。includeVectorResponse:是否在搜索响应中包含向量字段。默认值为false。
注意: 从 Elasticsearch 服务器 9.2 版本起,向量字段默认从响应中排除。若要在响应中包含 向量字段(不 推荐),请在 builder 中设置
includeVectorResponse:ElasticsearchConfiguration configuration = ElasticsearchConfigurationHybrid.builder()
.includeVectorResponse(true)
.build();
创建自定义配置
你可以通过实现 ElasticsearchConfiguration 接口来创建自己的 Elasticsearch 配置。例如:
public class MyElasticsearchConfiguration implements ElasticsearchConfiguration {
@Override
SearchResponse<Document> vectorSearch(
ElasticsearchClient client,
String indexName,
EmbeddingSearchRequest embeddingSearchRequest) {
// Your optional custom vector search implementation here
}
@Override
SearchResponse<Document> fullTextSearch(
ElasticsearchClient client,
String indexName,
String textQuery) {
// Your optional custom full text search implementation here
}
@Override
SearchResponse<Document> hybridSearch(
ElasticsearchClient client,
String indexName,
EmbeddingSearchRequest embeddingSearchRequest,
String textQuery) {
// Your optional custom hybrid search implementation here
}
}
请注意,你可以只实现与用例相关的方法:
vectorSearch用于向量相似度搜索(由ElasticsearchEmbeddingStore和ElasticsearchContentRetriever使用)。fullTextSearch用于全文搜索(仅由ElasticsearchContentRetriever使用)。hybridSearch用于混合搜索(仅由ElasticsearchContentRetriever使用)。