python借助elasticsearch实现精准查询与bm25查询
Elasticsearch query查询;python向量库;bm25搜索,精准匹配
·
python elasticsearch实现精准查询与bm25查询
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
from elasticsearch_dsl import Search
from elasticsearch_dsl.query import Match
1)连接 Elasticsearch
es = Elasticsearch(['http://127.21.0.0:9200'],
http_auth=('elastic', '123456')) # 替换为你的用户名和密码
2)创建es索引
your_index_name= 'my_es_index' # 设置自己的es索引名称
es.indices.create(index=your_index_name, ignore=400)
定义文档映射
映射(Mapping) 是指定义文档及其包含的字段如何存储和索引的过程。
doc_mapping = {
"properties": {
"content": {
"type": "text",
"similarity": "BM25" # 使用BM25相似性算法
},
"parent_id": {
"type": "keyword" # 使用keyword类型以进行精确匹配
} ,
"class_id": {
"type": "keyword" # 使用keyword类型以进行精确匹配
}
}
}
这里定义了使用BM25索引的content字段;以及支持精确索引的parent_id和class_id字段。
创建文档映射
es.indices.put_mapping(index=index_name, body=doc_mapping)
3)批量插入文档
docs = [
{"class_id":'aa12234551', "parent_id":12234551, "content": "哇吃了橘子", "inx": 3},
{"class_id":'aa12234551', "parent_id":12234551,"content": "阿飞 吃了橙子", "inx": 4},
{"class_id":'aa12234551', "parent_id":12234551,"content": "冬天不允许穿裤衩", "inx": 5},
{"class_id":'bbaa12234551', "parent_id":12234552, "content": "不知道这个人哇吃了橘子", "inx": 3},
# 添加更多文档...
]
准备批量插入的动作
actions = [
{"_index": index_name, "_source": doc} for doc in docs
]
使用bulk函数批量插入文档
bulk(es, actions)
4)查询文档
构建查询体
query = {
"query": {
"bool": {
"must": [
{
"match": {
"content": "哇撒吃了橘子"
}
},
{
"term": {
"parent_id": 12234551
}
}
]
}
}
}
这里使用bool可以进行多条件查询,其中must的“match”表示使用bm25对这个字段进行搜索,而“term”表示对"parent_id"这个字段精准搜索。must类似SQL中的and;若想使用类似SQL中or, 代表匹配其中一个条件则用should条件替换掉must。
执行搜索
response = es.search(index=your_index_name, body=query) # 替换"your_index_name"为你的索引名称
输出搜索结果
Dis = []
Inx = []
for hit in response['hits']['hits']:
# print(f"Document Score: {hit.meta.score}, Content: {hit.content}, id:{hit.inx}")
Dis.append(hit['_score'])
Inx.append(hit['_source']['inx'])
5)查询要删除的文档
query = {
"query": {
"bool": {
"must": [
{
"match": {
"content": "哇撒吃了橘子"
}
},
{
"term": {
"item_id": 12234551
}
}
]
}
}
}
执行查询
search_results = es.search(index=your_index_name, body=query)
遍历查询结果并删除文档
for hit in search_results['hits']['hits']:
document_id = hit['_id']
es.delete(index=index_name, id=document_id)
6)删除整个index
from elasticsearch import Elasticsearch
es = Elasticsearch(['http://127.21.0.0:9200'],
http_auth=('elastic', '123456')) # 替换为你的用户名和密码)
index_name= 'my_es_index'
es.indices.delete(index=index_name, ignore=[400, 404])
print(f"Index {index_name_to_delete} and its data have been deleted.")
更多推荐
已为社区贡献2条内容
所有评论(0)