之前说了很多查询,接下来继续:
我们可以利用query_string的关键词来做匹配,可以省去之前用写bool加两个must的方式。例如:
GET /movie/_search
{
"query": {
"query_string": {
"fields": ["title"],
"query": "steve AND jobs"
}
}
}
filter,关于filter的但条件过滤之前就讲过了,回顾一下:
GET /movie/_search
{
"query": {
"bool": {
"filter": [
{
"term":{"title":"steve"}
}
]
}
}
}
那么多条件过滤呢?
GET /movie/_search
{
"query": {
"bool": {
"filter": [
{"term":{"title":"steve"}},
{"term":{"cast.name":"gaspard"}},
{"range":{"release_date":{"lte":"2015/01/01"}}},
{"range":{"popularity":{"gte":"25"}}}
]
}
},
"sort": [
{
"popularity": {
"order": "desc"
}
}
]
}
先提一下,一般filter过滤是打分都是0,所以都用term精确匹配。关于“range”更像是大于小于的排序。
那如果想在filter中还带条件呢?
GET /movie/_search
{
"query": {
"bool": {
"should": [
{"match": {
"title": "life"
}}
],
"filter": [
{"term":{"title":"steve"}},
{"term":{"cast.name":"gaspard"}},
{"range":{"release_date":{"lte":"2015/01/01"}}},
{"range":{"popularity":{"gte":"25"}}}
]
}
}
}
当布尔表达式中有filter的时候,也就是说即便should不满足条件也会返回,只不过返回的是0而已,那should加filter一起的话,filter控制条件搜索,should控制打分,那么两个一起用,有结果二者都满足的话,也就有分数了。
关于查全率和查准率
查全率:例如一共有100个文档,正确的结果有60个文档,而查询出来正确的有40个,这样的查全率就是40/60
查准率:查出了40个文档,里面有30个是正确的,那么查准率就是30/40
这里的正确是人为感知的正确。例如查询“苹果”,会显示出食物和手机,那么二者只有一个是正确的。
虽然二者不可兼得,但可以调整排序。
扫描二维码关注公众号,回复:
10828765 查看本文章
自定义score算法:
GET /movie/_search
{
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "steve jobs",
"fields": ["title","overview"],
"operator": "or",
"type": "most_fields"
}
},
"functions": [
{
"field_value_factor": {
"field": "popularity",
"modifier": "log2p",
"factor": 10
}
}
]
}
}
}
打开分数监控可以看出,在tf/idf的打分下面,还有一个打分:
这就是我们上面自定义的分数,乘以之前的分数,就得到了现在的分数。当然从上面代码也可以看出,functions是个数组,可以放多个,需要注意的是,这里面的分数都是相乘的。
当然这个分数相乘会变得很大,所以添加命令,使相乘变成相加:其中score_mode是指function内部分数相加,boost_mode指function得分与TF/IDF得分相加。
GET /movie/_search
{"explain": true,
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "steve jobs",
"fields": ["title","overview"],
"operator": "or",
"type": "most_fields"
}
},
"functions": [
{
"field_value_factor": {
"field": "popularity",
"modifier": "log2p", //将字段值+2后计算对数
"factor": 10 //字段预处理*10
}
}
],
"score_mode": "sum",
"boost_mode": "sum"
}
}
}