Langchain 使用 Elasticsearch,对 Metadata 同一字段的多个属性值进行筛选

背景

使用Langchain + Elasticsearch 做向量知识库检索时,可能会需要根据 metadata 做数据筛选。

(本文主要演示对一个字段的多个属性值进行精确或模糊筛选。)

假设 metadata 数据格式如下:

1"metadata":{"source":"...","author":"zhangsan","date":"2008-03-08"}
2"metadata":{"source":"...","author":"lisi","date":"2009-09-09"}
3"metadata":{"source":"...","author":"liwu","date":"2001-04-05"}
...

一般的检索代码如下:

from langchain.vectorstores.elasticsearch import ElasticsearchStore
db = ElasticsearchStore(...)
...
returns = db.similarity_search("检索的问题", k=4)

如果需要根据 metadata 筛选符合条件的数据,则需要增加 filter 参数:

filter_parms = ...
returns = db.similarity_search("检索的问题", k=4, filter=filter_parms)

1、精确筛选

1、精确匹配一个字段的个值:
[{'term': {'metadata.<字段名>.keyword': <字段值>}}]

举例:只筛选出 author"zhangsan" 的数据:

filter_parms = [{'term': {'metadata.author.keyword': "zhangsan"}}]

2、精确匹配一个字段的个值:
[{'terms': {'metadata.<字段名>.keyword': <多个字段值列表>}}]

举例:筛选出 author"zhangsan" 或者 "lisi" 的数据:

filter_parms = [{'terms': {'metadata.author.keyword': ["zhangsan", "lisi"]}}]

2、模糊筛选

1、模糊匹配一个字段的个值:
[{"bool": {"should": {"match": {"metadata.<字段名>": <字段值>}}}]

举例:只筛选出 author 包含 "li" 的数据(会匹配到 lisiliwu):

filter_parms = [{"bool": {"should": {"match": {"metadata.author": "li"}}}]

2、模糊匹配一个字段的个值:
[{"bool": {"should": {"match": {"metadata.<字段名>": <字段值1>}}, {"match": {"metadata.<字段名>": <字段值2>}...}}]

举例:筛选出 author 包含 "li" 或者 "zhang" 的数据(会匹配到 zhangsanlisiliwu):

filter_parms = [{"bool": {
	"should": {
		"match": {"metadata.author": "li"},
		"match": {"metadata.author": "zhang"},
	}
}]

更多筛选方法可以参考Langchain文档:https://python.langchain.com/docs/integrations/vectorstores/elasticsearch

### LangChain4J中的元数据信息 在LangChain4J框架下,元数据(metadata)对于跟踪和管理文档及其片段至关重要。当通过不同类型的`DocumentLoader`加载文档时,这些加载器会自动提取并关联相应的元数据到每一个文档对象。 #### GitHubDocumentLoader的元数据特性 GitHubDocumentLoader来自`langchain4j-document-loader-github`模块[^1],用于从GitHub仓库中读取特定路径下的文件作为文档。此加载器能够捕获关于源文件的关键细节,包括但不限于: - **repository**: 文件所在的Git仓库名称。 - **branch**: 所属分支名。 - **path**: 文件相对于仓库根目录的具体位置。 - **commit_sha**: 提交哈希值,表示最后一次修改该文件的提交记录。 ```java // 示例Java代码展示如何配置GitHubDocumentLoader来获取带有元数据的信息 import com.langchain.documentloader.github.GitHubDocumentLoader; public class Example { public static void main(String[] args) throws Exception { var loader = new GitHubDocumentLoader( "owner", // 仓库拥有者 "repo-name", // 仓库名字 "main", // 分支名 "/docs/file.md" // 文件路径 ); List<Document> documents = loader.load(); for (var doc : documents){ System.out.println(doc.metadata()); } } } ``` #### 其他加载器的通用元数据属性 除了GitHubDocumentLoader外,其他如FileSystemDocumentLoader、UrlDocumentLoader等也提供了各自的元数据字段[^3]。尽管具体项可能有所不同,但通常都会包含创建时间戳、最后更新时间和来源URL等基本信息。 为了更好地利用这些元数据,在构建应用逻辑时可以根据需求筛选或聚合相关信息,从而实现更加智能化的内容处理流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薄荷你玩_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值