hi,我是蛋挞,一个初出茅庐的后端开发,希望可以和大家共同努力、共同进步!
- 起始标记->深入搜索(13讲):「32 | 使用Search Template和Index Alias查询」
- 结尾标记->深入搜索(13讲):「33 | 综合排序:Function Score Query优化算分」
使用Search Template和Index Alias查询
Search Template - 解耦程序 & 搜索 DSL
- Elasticsearch 的查询语句
- 对相关性算分/查询性能都至关重要
- 在开发初期,虽然可以明确查询参数,但是往往还不能最终定义查询的DSL的具体结构
- 通过 Search Template 定义一个Contract
- 各司其职,解耦
- 开发人员/搜索工程师/性能工程师
Index Alias 实现零停机运维
本节知识回顾
学习了Search Template和Index Alias,通过Search Template可以使搜索和DSL分离,通过Index Alias,当出现索引的改名或索引的重建时前端的程序可以保持不间断的查询。
CodeDemo
POST _scripts/tmdb { "script": { "lang": "mustache", "source": { "_source": [ "title","overview" ], "size": 20, "query": { "multi_match": { "query": "{{q}}", "fields": ["title","overview"] } } } } } DELETE _scripts/tmdb
GET _scripts/tmdb
POST tmdb/_search/template { "id":"tmdb", "params": { "q": "basketball with cartoon aliens" } }
PUT movies-2019/_doc/1 { "name":"the matrix", "rating":5 }
PUT movies-2019/_doc/2 { "name":"Speed", "rating":3 }
POST _aliases { "actions": [ { "add": { "index": "movies-2019", "alias": "movies-latest" } } ] }
POST movies-latest/_search { "query": { "match_all": {} } }
POST _aliases { "actions": [ { "add": { "index": "movies-2019", "alias": "movies-lastest-highrate", "filter": { "range": { "rating": { "gte": 4 } } } } } ] }
POST movies-lastest-highrate/_search { "query": { "match_all": {} } }
综合排序:Function Score Query优化算分
算分与排序
- Elasticsearch 默认会以文档的相关度算分进行排序
- 可以通过指定一个或者多个字段进行排序
- 使用相关度算分 (score) 排序,不能满足某些特定条件
- 无法针对相关度,对排序实现更多的控制
Function Score Query
- Function Score Query
- 可以在查询结束后,对每一个匹配的文档进行一系列的重新算分,根据新生成的分数进行排序
- 提供了几种默认的计算分值的函数
- Weight: 为每一个文档设置一个简单而不被规范化的权重
- Field Value Factor: 使用该数值来修改_score,例如将“热度”和“点赞数”作为算分的参考因素
- Random Score: 为每一个用户使用一个不同的,随机算分结果
- 衰减函数: 以某个字段的值为标准,距离某个值越近,得分越高
- Script Score:自定义脚本完全控制所需逻辑
按受欢迎度提升权重
- 希望能够将点赞多的 blog,放在搜索列表相对靠前的位置。同时搜索的评分,还是要作为排序的主要依据
- 新的算分 =老的算分*投票数
- 投票数为0
- 投票数很大时
使用 Modifier 平滑曲线
- 新的算分 = 老的算分 * log(1+投票数)
引入Factor
- 新的算分 = 老的算分 * log(1+factor *投票数)
Boost Mode 和 Max Boost
- Boost Mode
- Multiply: 算分与函数值的乘积
- Sum:算分与函数的和
- Min / Max:算分与函数取 最小/ 最大值
- Replace: 使用函数值取代算分
- Max Boost 可以将算分控制在一个最大值
一致性随机函数
- 使用场景:网站的广告需要提高展现率
- 具体需求: 让每个用户能看到不同的随机排名,但是也希望同一个用户访问时,结果的相对顺序,保持一致(Consistently Random)
本节知识回顾
学习了一个复合查询Function Score Query,通过Function Score Query可以对搜索结果的算分做一个精度的控制,学习了将一个字段引入作为参考的因素对算分进行重排,也学习了通过一致性随机函数,随机的尝试搜索的结果。
CodeDemo
DELETE blogs PUT /blogs/_doc/1 { "title": "About popularity", "content": "In this post we will talk about...", "votes": 0 }
PUT /blogs/_doc/2 { "title": "About popularity", "content": "In this post we will talk about...", "votes": 100 }
PUT /blogs/_doc/3 { "title": "About popularity", "content": "In this post we will talk about...", "votes": 1000000 }
POST /blogs/_search { "query": { "function_score": { "query": { "multi_match": { "query": "popularity", "fields": [ "title", "content" ] } }, "field_value_factor": { "field": "votes" } } } }
POST /blogs/_search { "query": { "function_score": { "query": { "multi_match": { "query": "popularity", "fields": [ "title", "content" ] } }, "field_value_factor": { "field": "votes", "modifier": "log1p" } } } }
POST /blogs/_search { "query": { "function_score": { "query": { "multi_match": { "query": "popularity", "fields": [ "title", "content" ] } }, "field_value_factor": { "field": "votes", "modifier": "log1p" , "factor": 0.1 } } } }
POST /blogs/_search { "query": { "function_score": { "query": { "multi_match": { "query": "popularity", "fields": [ "title", "content" ] } }, "field_value_factor": { "field": "votes", "modifier": "log1p" , "factor": 0.1 }, "boost_mode": "sum", "max_boost": 3 } } }
POST /blogs/_search { "query": { "function_score": { "random_score": { "seed": 911119 } } } }
相关阅读
此文章为3月Day7学习笔记,内容来源于极客时间《Elasticsearch 核心技术与实战》