跳到主要内容

Elasticsearch

https://www.elastic.co/

Maven 依赖

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-elasticsearch</artifactId>
<version>1.18.1-beta28</version>
</dependency>

概述

langchain4j-elasticsearch 模块提供了将 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 实例,需要提供 ElasticsearchClientEmbeddingModel

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 接口创建自定义配置, 也可以使用以下已提供的实现之一:

要创建配置实例,可以使用各实现提供的 builder。例如:

ElasticsearchConfiguration configuration = ElasticsearchConfigurationKnn.builder().build();

ElasticsearchConfigurationKnn

ElasticsearchConfigurationKnn 使用近似 kNN 查询执行向量相似度搜索。

它是 ElasticsearchEmbeddingStoreElasticsearchContentRetriever 使用的默认配置。

要创建实例,可以使用 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 查询执行向量相似度搜索。请注意,该 实现使用余弦相似度。

它同时适用于 ElasticsearchEmbeddingStoreElasticsearchContentRetriever

要创建实例,可以使用 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 用于向量相似度搜索(由 ElasticsearchEmbeddingStoreElasticsearchContentRetriever 使用)。
  • fullTextSearch 用于全文搜索(仅由 ElasticsearchContentRetriever 使用)。
  • hybridSearch 用于混合搜索(仅由 ElasticsearchContentRetriever 使用)。

示例