1.简介

一条SQL中可能有多个等值、范围、in查询,它们之间在SQL中使用and 或者or 的关系符号连接。那么在ES中自然也是有相关查询的独特写法的。

2.Boolean聚合查询

这种查询等价于SQL中的and、or查询符号。具体官方文档的翻译我并没有读太懂。但是我们最终的目标不是会说,而是在实际的开发中可以灵活的使用。

2.1must等价于and

在boolean查询中must就是sql中的and。

  • 需求:查询shopId为92的,sales在10到200之间的数据
  • SQL语句

    1. select * from goods where shopId = 92 and sales>=10 and sales <=200;
  • ES查询

    1. {
    2. "query": {
    3. "bool": {
    4. "must": [
    5. {
    6. "term": {
    7. "shopId": {
    8. "value": 92
    9. }
    10. }
    11. },
    12. {
    13. "range": {
    14. "sales": {
    15. "gte": 10
    16. }
    17. }
    18. },
    19. {
    20. "range": {
    21. "sales": {
    22. "lte": 200
    23. }
    24. }
    25. }
    26. ]
    27. }
    28. }
    29. }

    2.2should等价于or

  • 需求:查询shopId为92或93的数据

  • SQL语句

    1. select * from goods where shopId = 92 or shopId =93;
  • ES查询

    1. {
    2. "query": {
    3. "bool": {
    4. "should": [
    5. {
    6. "term": {
    7. "shopId": {
    8. "value": 92
    9. }
    10. }
    11. },
    12. {
    13. "term": {
    14. "shopId": {
    15. "value": 93
    16. }
    17. }
    18. }
    19. ]
    20. }
    21. }
    22. }

2.3must和should的优先关系

同and和or的关系一样,先and后or。那可能就有疑问,(a=1 and b=2) or (c=3 and d =1)这样的咋搞?
其实bool查询也可以嵌套一层bool查询。

  1. {
  2. "query": {
  3. "bool": {
  4. "should": [
  5. {
  6. "bool": {
  7. "must": [
  8. {...}
  9. ]
  10. }
  11. }
  12. ]
  13. }
  14. }
  15. }

2.4另外两个查询方式

①must_not:一定不相当于SQL not用法,比如not in
②filter:过滤的作用,效果和must等同,不同点在于匹配的得分是恒定的 0