elasticsearch使用笔记(二)
bool查询
- Must,多个条件同时满足
- Should, 至少满足一个条件,可以通过minimum_match=n设置使至少满足n个条件
几种匹配形势的简介
- Term,精准查询(在目标字段后加.keyword,则为不分词)
{"term":{"name.keyword": "彭于晏"} }
- Terms,同1,可以看做一系列的term匹配,输入一个list中将匹配到的元素得分相加
{"terms":{"name.keyword": ["彭于晏","吴亦凡"]} }
- Match_phrase, 短语匹配,目标字段中出现同样的短语则匹配得分,可以认为是子串查询,通过设置slop=n可以允许目标短语中间有n个非查询短语中的词
{
"match_phrase": {
"title": "machine learning",
"slop":3
}
或者
{"match": {
"title": {
"query": "machine learning",
"type": "phrase",
"slop":3
}
}
- Match, 单词匹配,然后计算相似度得分
{"match": {
"title": {
"query": "machine learning",
}
}
- Multi_match, 同时匹配好几个目标字段,在字段上^+weight可以设置权重,得分为最大分值字段的得分,tie_break=m表示得分为最大分值字段的得分+m*非最大分值字段的得分
{"multi_match":
{
"query":"machine learning" ,
"fields": ["title", "abstract^0.5"],
"tie_breaker": 0.1
}
}
function score
Function_score, 一般用来进一步优化排序结果,设置权重等,可以使用guass等衰减函数
二次打分
Rescore, 二次打分,可以输入打分规则的脚本,但是全库搜索会极大降低搜索效率,所以一般选择对返回的前n个结果进行再次打分,并加在原本的得分上,以此优化排序
query模板
must_list 示例
must_list = [
{"term":{"name.keyword": "彭于晏"} },
{"term":{"position.keyword": "actor"} },
]
should_list示例
should_list = [
{"multi_match":
{
"query":"machine learning" ,
"fields": ["title", "abstract^0.5"],
"tie_breaker": 0.1
}
},
{
"match_phrase": {
"title": "machine learning",
"slop":3
}
]
function_list示例
functions_list= [{
"gauss": {
"count": {
"origin": 200,
"scale": "10",
"decay": "0.2"
}
}
}]
万能query模板,可自由增删
最终的得分为query的得分*function_score+re_score
query = {
"_source": ["name","title"], # 返回的字段
"size": 100,
"query": {
"function_score": {
"functions": functions_list,
"query": {
"bool": {
"must": must_list,
"should": should_list
},
},
"score_mode": "multiply"}
},
"rescore":{
"window_size":100,
"query": {
"rescore_query": {
"bool":{
"should":rescore_list
}
}
}
}
}
具体打分机制
之后再添加