老铁们,今天我们来聊聊一个在搜索引擎领域备受关注的技术点——ElasticSearch中的BM25。说白了,这就是一个基于概率检索框架的文档排序算法,最初由Stephen E. Robertson和Karen Spärck Jones等高手在20世纪的70至80年代提出。BM25如今已成为许多搜索引擎的核心技术。
技术背景介绍
ElasticSearch作为一个分布式、RESTful的搜索与分析引擎,提供了多租户能力的全文搜索引擎,通过HTTP接口和schema-free JSON文档来进行数据交互。而BM25(Okapi BM25)是一种用于搜索引擎评估文档与给定查询相关性的排序函数。相比于传统的TF-IDF方法,BM25在处理不同长度的文档时表现更优。
原理深度解析
BM25基于概率检索模型,它在一定程度上解决了TF-IDF无法有效处理文档长度差异的问题。其公式通过调节参数b(文档长度正则化系数)和k1(词频平滑系数),来提高对不同规模文档的适应性。
实战代码演示
接下来,我们进入实战环节,使用ElasticSearch来实现BM25。首先,确保安装并升级了ElasticSearch的Python客户端:
%pip install --upgrade --quiet elasticsearch
然后,我们使用ElasticSearchBM25Retriever
来创建一个新的检索器:
from langchain_community.retrievers import (
ElasticSearchBM25Retriever,
)
elasticsearch_url = "http://localhost:9200"
retriever = ElasticSearchBM25Retriever.create(elasticsearch_url, "langchain-index-4")
如果我们已经有一个索引,可以直接加载:
# import elasticsearch
# retriever = ElasticSearchBM25Retriever(elasticsearch.Elasticsearch(elasticsearch_url), "langchain-index")
这下就可以开始操作了!如果需要添加文本,可以执行以下操作:
retriever.add_texts(["foo", "bar", "world", "hello", "foo bar"])
这波操作可以说是相当丝滑。添加文本后,我们就能进行检索:
result = retriever.invoke("foo")
print(result)
优化建议分享
在使用ElasticSearch与BM25时,有几点优化建议:首先,确保你的索引数据是标准化的,文档长度不同可能会影响BM25的效果。其次,适当调整b和k1参数,来优化排序效果。最后,考虑使用代理服务提高稳定性和查询效率。
补充说明和总结
我个人一直在用 https://yunwu.ai 提供的一站式大模型解决方案,帮助快速部署和管理ElasticSearch这样的搜索引擎。对于有更复杂需求的项目,这种服务可以显著简化开发流程。
今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~
—END—
标签:BM25,实践,搜索引擎,文档,elasticsearch,ElasticSearchBM25Retriever,ElasticSearch From: https://blog.csdn.net/dfitghjk/article/details/144798155