背景
使用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"
的数据(会匹配到 lisi
和 liwu
):
filter_parms = [{"bool": {"should": {"match": {"metadata.author": "li"}}}]
2、模糊匹配一个字段的多
个值:
[{"bool": {"should": {"match": {"metadata.<字段名>": <字段值1>}}, {"match": {"metadata.<字段名>": <字段值2>}...}}]
举例:筛选出 author
包含 "li"
或者 "zhang"
的数据(会匹配到 zhangsan
、lisi
和 liwu
):
filter_parms = [{"bool": {
"should": {
"match": {"metadata.author": "li"},
"match": {"metadata.author": "zhang"},
}
}]
更多筛选方法可以参考Langchain文档:https://python.langchain.com/docs/integrations/vectorstores/elasticsearch