bool查询评分
{
"query": {
"bool": {
"should": [
{ "match": { "title": "Brown fox" }},
{ "match": { "body": "Brown fox" }}
]
}
}
}
评分方式:
它会执行 should 语句中的两个查询。
加和两个查询的评分。
乘以匹配语句的总数。
除以所有语句总数(这里为:2)
{
"query": {
"bool": {
"should": [
{ "match": { "title": "War and Peace" }},
{ "match": { "author": "Leo Tolstoy" }},
{ "bool": {
"should": [
{ "match": { "translator": "Constance Garnett" }},
{ "match": { "translator": "Louise Maude" }}
]
}}
]
}
}
}
评分方式:
它会执行 should 语句中的两个查询。
加和两个查询的评分。
乘以匹配语句的总数。
除以所有语句总数(这里为:3不是4,bool作为should子查询算一条)
1、如果bool查询中只有一个should,那么shuold里的查询至少要匹配一个
2、如果bool查询中还有must或者must_not其他的查询,那么should中的查询可以不用匹配,(匹配到了_score更高)
3、minimum_should_match:最少匹配的条数
{
"query": {
"match": {
"title": {
"query": "BROWN DOG!",
"operator": "and"
}
}
}
}
两个必须都匹配
{
"query": {
"match": {
"title": {
"query": "quick brown dog",
"minimum_should_match": "2"
}
}
}
}
至少匹配2个
4、boost:权重,提高相关度得分
5、dis_max查询:分离最大化查询如下例:
存储两条文档
{
"title": "Quick brown rabbits",
"body": "Brown rabbits are commonly seen."
}
{
"title": "Keeping pets healthy",
"body": "My quick brown fox eats rabbits on a regular basis."
}
查询1:
{
"query": {
"bool": {
"should": [
{ "match": { "title": "Brown fox" }},
{ "match": { "body": "Brown fox" }}
]
}
}
}
结果1:
{
"hits": [
{
"_id": "1",
"_score": 0.14809652,
"_source": {
"title": "Quick brown rabbits",
"body": "Brown rabbits are commonly seen."
}
},
{
"_id": "2",
"_score": 0.09256032,
"_source": {
"title": "Keeping pets healthy",
"body": "My quick brown fox eats rabbits on a regular basis."
}
}
]
}
会发现数据1的得分更高,原因是数据1的tittle和body都能匹配到brown,这跟bool的评分方式相关,数据2中只有body能匹配到brown fox(单个匹配度更高)。
但有时候我们就想获取单个匹配度高的怎么办?dix_max查询
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Brown fox" }},
{ "match": { "body": "Brown fox" }}
]
}
}
}
这要就会使单个查询匹配度更高的评分更高。
那么又有一个新问题,
如下查询
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Quick pets" }},
{ "match": { "body": "Quick pets" }}
]
}
}
}
{
"title": "Quick brown rabbits",
"body": "Brown rabbits are commonly seen."
}
{
"title": "Keeping pets healthy",
"body": "My quick brown fox eats rabbits on a regular basis."
}
数据1和2的单个查询匹配度相同:数据2的tittle和body都只能匹配到一条(tittle匹配到pets,body匹配到quick),数据1的body能匹配到quick,很明显以我们主观看来数据2的匹配度应该更高,怎么做?参数:tie_breaker
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Quick pets" }},
{ "match": { "body": "Quick pets" }}
],
"tie_breaker": 0.3
}
}
}
tie_breaker 可以是 0 到 1 之间的浮点数,其中 0 代表使用 dis_max 最佳匹配语句的普通逻辑, 1 表示所有匹配语句同等重要(等同于bool评分逻辑)。
6、match_phrase查询:默认是精确查询。参数slot
比如查询quick brown fox,那么就是只能匹配到含‘quick brown fox’的,如果想让能匹配到quick fox怎么办?
{
"query": {
"match_phrase": {
"title": {
"query": "quick fox",
"slop": 1
}
}
}
}
想匹配到fox quick怎么办?slot值为3
7、prefix和wildcard :prefix前缀匹配,wildcard 可使用表达式( ? 匹配任意字符, * 匹配 0 或多个字符)
{
"match_phrase_prefix" : {
"brand" : "johnnie walker bl"
}
}
与 match_phrase 查询一致,不同的是它将查询字符串的最后一个词作为前缀使用
,换句话说,可以将之前的例子看成如下这样:
johnnie
跟着 walker
跟着以 bl 开始的词
与 match_phrase 一样,它也可以接受 slop 参数(参照 slop )让相对词序位置不那么严格:但是只有查询字符串的最后一个词才能当作前缀使用。
8、max_expansions :限制匹配到的数量(比如match_phrase、prefix等)