一、如何优化多字段查询
1. 提升字段查询得分:
将title字段查询比重提升10倍:
GET /movies/_search
{
"explain": true,
"query":{
"multi_match":{
"query": "good hearts sea",
"fields": ["title^10", "overview"]
}
}
}
2. 综合提升字段查询得分:
使用tie_breaker将其他query的分数也考虑进去
GET /movies/_search
{
"query":{
"multi_match":{
"query": "good hearts sea",
"fields": ["title", "overview"],
"tie_breaker": 0.3
}
}
}
使用 tie_breaker 和不使用查询出来的某一条数据的 _score 分数,会有相应的提高,例如:
title 中包含关键词matched query 的得分,假设是 1.6overview中包含关键词matched query的得分,假设是 1.8
添加了 tie_breaker = 0.3,那么就是这样的了, 1.6 * 0.3 + 1.8 = 2.28;
大于最高一条的得分1.8,这样搜索的关联性就提升上去了, 更为合理。
二、多条件查询与过滤
1. 多条件查询:
GET /movie/_search
{
"query":{
"bool":{
"filter":[
{"term":{"title":"heart"}},
{"term":{"cast.name":"joseph"}},
{"range": { "release_date": { "lte": "2016/01/01" }}},
{"range": { "popularity": { "gte": "25" }}}
]
}
}
}
2. 增加排序处理:
GET /movie/_search
{
"query":{
"bool":{
"filter":[
{"term":{"title":"heart"}},
{"range": { "release_date": { "lte": "2017/01/01" }}},
{"range": { "popularity": { "gte": "10" }}}
]
}
},
"sort":[
{"release_date":{"order":"desc"}}
]
}
根据release_date进行倒序排列。
三、查全率与查准率
1. 什么是查全率:
索引内符合条件的结果有N个,查询出来的符合条件的结果有X个, 则查全率为: X/N
比如: 用户的关键词为笔记本(笔记本包含写字的笔记本以及电脑笔记本, 在索引中, 这些记录为1000条,即N),查询出来的结果如果是100条,即X(包含写字的笔记本以及电脑笔记本), 则查全率为10%。
2. 什么是查准率:
查询出来的X个文档中, 有M个是正确的, 则查准率为:M/X
比如: 用户的关键词为笔记本, 这些记录为1000条,查询出来的结果如果是100条, 而在这100条(X)当中只有20条(M)为用户期望的电脑笔记本, 则查准率为20%。
3. 自定义调整评分:
通过function_score实现自定义评分:
GET /movies/_search
{
"explain": true,
"query":{
"function_score": {
"query": {
"multi_match":{
"query": "good hearts sea",
"fields": ["title", "overview"]
}
},
"functions": [
{"field_value_factor": {
"field": "popularity",
"modifier": "log2p",
"factor": 20
}}
]
}
}
}
通过function_score将popularity评分调整, 采用log对数函数, 将系数放大20, 通过explain查看具体得分。
value得分为3.00
再乘以12.261267, 得出最终得分结果为36.875378。
本文由mirson创作分享, 感谢大家的支持, 希望对大家有所收获!
入群申请,请加WX号:woodblock99