背景

使用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

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐