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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Flask 中使用 Elasticsearch 进行向量查询,使用 KNN 并且对同一向量字段查询多次,可以按照以下步骤进行: 1. 安装 Elasticsearchelasticsearch-dsl 库。 2. 创建一个 Flask 应用程序,并在应用程序中创建 Elasticsearch 连接: ```python from flask import Flask from elasticsearch import Elasticsearch app = Flask(__name__) es = Elasticsearch() ``` 3. 定义一个查询函数,该函数接收查询向量和要查询的字段列表作为参数,并返回查询结果: ```python from elasticsearch_dsl import Search, Q, SF def knn_search(query_vector, fields): # 构建 Elasticsearch 查询 s = Search(using=es, index='index_name') for field in fields: s = s.query( Q('knn', **{ field: { 'vector': query_vector, 'k': 10 } }) ) # 执行查询 response = s.execute() # 处理查询结果 results = [] for hit in response.hits: results.append({ 'id': hit.meta.id, 'score': hit.meta.score, 'source': hit.to_dict() }) return results ``` 在上面的代码中,我们首先构建一个 Elasticsearch 查询,然后对每个要查询的字段构建一个 KNN 查询,并将它们添加到查询中。最后,我们执行查询,将查询结果转换为 JSON 格式,并返回给客户端。 4. 在 Flask 应用程序中定义一个路由,该路由接收 POST 请求,并从请求中获取查询向量和要查询的字段列表: ```python from flask import request, jsonify @app.route('/search', methods=['POST']) def search(): # 获取查询向量和要查询的字段列表 query_vector = request.json['vector'] fields = request.json['fields'] # 执行查询 results = knn_search(query_vector, fields) # 返回查询结果 return jsonify(results) ``` 在上面的代码中,我们使用 Flask 的 `request` 对象来获取请求中的 JSON 数据,然后调用 `knn_search` 函数执行查询并获取查询结果。最后,我们将查询结果转换为 JSON 格式,并返回给客户端。 注意,我们使用了 `request.json` 来获取请求中的 JSON 数据。这需要在 Flask 中启用 JSON 请求支持,可以使用以下代码实现: ```python from flask import Flask, request app = Flask(__name__) @app.before_request def before_request(): if request.method == 'POST' and request.is_json: request.json = request.get_json() ``` 在上面的代码中,我们使用 Flask 的 `before_request` 钩子函数,在每个请求到来之前,检查请求是否是 JSON 请求,如果是,则将请求中的 JSON 数据解析为 Python 对象,并将其设置为 `request.json` 属性。这样,在后续的请求处理中,我们就可以方便地使用 `request.json` 来获取请求中的 JSON 数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

薄荷你玩_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值