地址:https://elasticsearch.cn/article/202
1. 在Elasticsearch中应用机器学习排序LTR
将机器学习集成到搜索排名;使用简单的神经网络,最优化文档特征的权重值,最终达到一个最优解。
核心概念
使用不同的特征得到TopN的结果并进行评价,根据评价信息训练模型。
- 通过分析来衡量用户所反馈的相关度,并构建一个评价列表,将文档分级为精确相关的、模糊相关的和无关的,并用于查询;
- 猜想哪些特征可能有助于相关度预测,比如特定属性匹配程度的TF-IDF相关度、新颖性,以及搜索用户的个性化特征等;
- 训练一个模型,将这些特征准确无误地映射到一个相关性得分上;
- 部署该模型到你的搜索基础设施中,在线上环境中使用它来对搜索结果排序。
基本原理
LTR插件集成了RankLib和Elasticsearch。RankLib有一个输入文件作为评价依据,并输出一个模型,该模型是内置的可阅读格式。接下来RankLib可通过编程或命令行来训练模型。一旦有了模型,Elasticsearch插件就会包含以下内容:
- 一个自定义的Elasticsearch脚本语言,叫做ranklib,它把RankLib生成的模型作为一个Elasticsearch脚本;
- 一个自定义的LTR查询,它输入一个包含Query DSL查询(那些特征)、一个模型名称(就是第一步中上传的模型)和打分结果的列表。
由于LTR模型的实现成本很高,人们几乎不会直接使用LTR查询,而是对结果的Top N重新打分,比如:
{
"query": {/*a simple base query goes here*/},
"rescore": {
"window_size": 100,
"query": {
"rescore_query": {
"ltr": {
"model": {
"stored": "dummy"
},
"features": [{
"match": {
"title": <users keyword search>
}
}
...
实践步骤
- LTR概念:http://opensourceconnections.com/blog/2017/02/24/what-is-learning-to-rank/
- Github地址:https://github.com/o19s/elasticsearch-learning-to-rank
- Demo代码地址:https://github.com/o19s/elasticsearch-learning-to-rank/tree/master/demo
- 安装依赖准备数据;
- 下载TMDB数据,下载RankLib.jar;
- 启动ES并安装LTR插件;
- 索引数据到ES;
- 新建并且上传特征,特征使用1~n.json文件,每个特征可以包含一个简单查询或者复杂查询;
- 收集评价信息,每一个特征会生成一个三元组的评价信息文件;
- 将全部特征的评价信息文件进行合并;
- 使用合并后的文件进行训练;
- 使用训练结果进行搜索。
# 评价信息文件 <grade>,<docId>,<keywords>
# qid:1: rambo
#
#
# grade (0-4) queryid # docId title
4 qid:1 # 7555 Rambo
# 评价文件合并结果
4 qid:1 1:12.318446 2:9.8376875 # 7555 rambo
项目文档
地址:http://elasticsearch-learning-to-rank.readthedocs.io/en/latest/index.html
2. 用ElasticSearch搭建自己的搜索和分析引擎
地址:http://wetest.qq.com/lab/view/300.html
一篇入门加实践的文章,文章主要介绍了ES的核心概念、关键配置项、Mapping基本用法、聚合的用法,并结合实例对ES的性能进行了分析。