elasticSearch之查询细节

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等)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值