5定制化搜索场景设计和实现
学习目标
- 评分机制的概念和应用扩展
- 置顶搜索的设计和实现
目标
- 评分机制
- 置顶搜索
Elastic Search评分机制
搜索本质:计算文档与查询的匹配程度
匹配的依据是评分
相关性原理
TF-IDF
TF 分词频率 Term Frequence
IDF 逆文档频率 Inverse Document Frequency
关联度 = 词频(TF)与逆文档频率(IDF)的乘积
TF=某个分词在文章中出现的次数/此文档出现次数最多的词的出现次数
IDF= Log( 文档总数/(包含该词的文档数 +1))
举例
1 | 示例:考虑一个包含100个单词的文档,其中“天"这个分词出现了10次,那么TF =(10 / 100)= 0.1 |
向量空间模型
控制评分
- 权重 boosting
- 自定义评分 function_score
- 查询后二次评分 rescore_query
权重
Boost的含义:
当boost>1时,打分的相关度相对性提升
当0<boost<1时,打分的权重相对性降低
当boost<0时,贡献负分
1 | { |
匹配上positive的内容会放到结果集中
如果匹配上positive并且也匹配上了negative,那么降低这样的文档score
negative_boost:控制降低score的系数
自定义评分
- script score (最常见)
script脚本评分,灵活度最高 - weight
字段权重评分 - random_score
随机评分 - field_value_factor
字段值因子评分 - decay functions
gauss/linear/exp等衰减函数
script_socre - Plainess脚本
应用场景:定义最终评分的计算公式
- 字段再加工/统计输出
- 字段之间逻辑运算
- 定义特殊过滤条件
- 对字段个性化增删改操作
1
2Script pinnedscript =new Script("" + keyWord + "'==doc['name.keyword'].value ? 0:1")
ScriptSortBuilder pinnedSort = new ScriptSortBuilder(pinnedscriptScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.Asc);
基于Elastic Search实现置顶搜索
置顶搜索场景和需求
业务场景:对特定编号(如客服编号等)的业务数据进行置顶
核心诉求:可配置、可扩展、可控制有效期
实现
- 创建配置表
- 集成置顶搜索
1
2
3
4
5//1.从数据库中获取置顶搜索配置项PinnedQueryConfig pinnedQueryConfig =...;
//2,根据配置项内容构建搜索脚本
Script staffPinnedScript =new Script(...);
//3.创建ScriptSortBuilderScriptSortBuilder moviePinnedSort = new ScriptSortBuilder(staffPinnedScriptScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.Asc);
//4,整合到SearchSourceBuildersourceBuilder.sort(staffPinnedSort);
思考题
如果不希望特定的内容出现在搜索结果中,你有什么实现方法?