5定制化搜索场景设计和实现

学习目标

  • 评分机制的概念和应用扩展
  • 置顶搜索的设计和实现

目标

  • 评分机制
  • 置顶搜索

Elastic Search评分机制

搜索本质:计算文档与查询的匹配程度
匹配的依据是评分

相关性原理

TF-IDF

TF 分词频率 Term Frequence
IDF 逆文档频率 Inverse Document Frequency
关联度 = 词频(TF)与逆文档频率(IDF)的乘积
TF=某个分词在文章中出现的次数/此文档出现次数最多的词的出现次数
IDF= Log( 文档总数/(包含该词的文档数 +1))
举例

1
2
示例:考虑一个包含100个单词的文档,其中“天"这个分词出现了10次,那么TF =(10 / 100)= 0.1
并且假设索引中有1000W份文档数量,其中有1000份文档中出现了“天"这个分词,此时逆文档频率(IDF)计算为IDF = log(10,000,000/1,000)=4最终,TD-IDF计算为 TF*IDF =0.1*4 =0.4

向量空间模型

控制评分

  • 权重 boosting
  • 自定义评分 function_score
  • 查询后二次评分 rescore_query

权重

Boost的含义:
当boost>1时,打分的相关度相对性提升
当0<boost<1时,打分的权重相对性降低
当boost<0时,贡献负分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"query":{
"boosting":{
"positive":{
"term":{
"content":{
"value" :"elasticsearch"
}
}
},
"negative":{
"term":{
"content":{
"'value": "solr"
}
}
},
"negative_boost": 0.2
}
}
}

匹配上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
    2
    Script 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);

思考题

如果不希望特定的内容出现在搜索结果中,你有什么实现方法?