Elasticsearch复合查询高级查询

Elasticsearch查询和过滤器DSL

前面采用了query中的match_all进行了数据查询 返回了所有数据,对数据进行分页,以及排序操作
match 查询和term过滤器


测试书来源es官网测试数据
  1. 采用macth查询age为39的用户
{
  "from": 0,
  "size": 100,
  "query": {
    "match": {
      "age": {
        "query": "39"
      }
    }
  }
}
查询结果
  1. 使用term查询
{
  "from": 0,
  "size": 10,
  "query": {
    "term": {
      "age": {
        "value": "36"
      }
    }
  },
  "_source": ["address","age"]
}
#terms查询
{
  "from": 0,
  "size": 10,
  "query": {
    "terms": {  
      "age":["36","39"]
    }
  },
  "_source": ["address","age"]
}
term过滤器查询

Elasticsearch查询和过滤器有严格的区分会影响到最终的得分,查询会为有特定的词条计算得分,搜索的过滤器只是为文档是否匹配这个查询返回简单的是或者否。过滤器所需要的处理更少,并且可以被缓存

  1. match_all查询
{
  "from": 0,
  "size": 10,
  "query": {
    "match_all": {}
  },
  "_source": ["address","age"]
}

match_all 为全部查询 对于es来讲不是很有用,因为使用到es很少使用到全部查询

  1. query_string查询
{
  "from": 0,
  "size": 100,
  "query": {
    "query_string": {
      "default_field": "address",#设置只针对address字段查询  
      "query": "451 166"#query的查询条件
    }
  }
}

query_string查询将会搜索_all字段,通过设置default_field来进行设置针对某个字段查询,query_string是es最强有力的查询之一,但有时候也是最难阅读和扩展的插叙之一,建议替换的方案包括term,terms,match或者muliti_match查询
另一个良好的替换方案可以采用simple_query_string进行替换,simple_query_string查询提供 +-\and\OR 进行查询


simple query string
{
  "from": 0,
  "size": 100,
  "query": {
    "simple_query_string": {
      "query": "32 -702", #表示查询字段值为32 并且字段值不包含702的数据
      "default_operator": "and" #设置默认的一个链接符号查询 等价于 查询参数值 filed=32 and filed!=702
    }
  }
}
  1. term查询和term过滤器
{
  "from": 0,
  "size": 100,
  "query": {
    "term": {
      "age": {
        "value": "34"
      }
    }
  }
}

term查询和过滤器是可执行查询中最简单的几个,它们让你可以指定需要搜索的文档字段,和词条。由于被搜索的词条是没有经过分析的,文档中的词条必须要精确匹配才能够被返回。

  1. match查询和term过滤器
{
  "from": 0,
  "size": 100,
  "query": {
    "match": {
      "age": {
        "query": "32"
      }
    }
  }
}
  1. match_phrase查询
{
  "from": 0,
  "size": 100,
  "query": {
    "match_phrase": {
      "age": {
        "query": "32",
        "slop": 1 //将slop设置为1 告诉Es允许词条之间有间隔
      }
    }
  }
}

match_phrase查询包含的结果,设置slop设置为1或者2表示查询你可能不知道的精确标题,就可以查询到包含该词组的结果

  1. phrase_prefix查询
    和match_phrase_prefix查询类似,phrase_prefix查询可以更近一步搜索词组,不过它是和词组中最后一个词条进行前缀匹配。对于提供搜索框里的自动完成功能而言,这个行为是非常有用的,这样用户输入搜索词条就能获得提示。
{
  "from": 0,
  "size": 100,
  "query": {
    "match_phrase_prefix": {
      "address": {
        "query": "A"
      }
    }
  }
}

使用multi_match来匹配多个字段

{
  "from": 0,
  "size": 100,
  "query": {
    "multi_match": {
      "fields": [
        "address",
        "age"
      ],
      "query": "171"
    }
  }
}

组合查询或复合查询

  1. bool查询

bool查询

{
  "from": 0,
  "size": 100,
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "age": {# 结果文档必须匹配的查询条件
              "value": 32
            }
          }
        }
      ],
      "should": [
        {
          "term": {#文档应该匹配的第一个查询
            "gender": {
              "value": "M"
            }
          }
        },{
          "term": { #文档应该匹配的第二个查询
            "balance": {
              "value": 19594
            }
          }
        }
      ],
      "minimum_should_match": 1,#最小的should子句匹配个数
      "must_not": [
        {
          "term": {
            "account_number": {
              "value": "120"
            }
          }
        }
      ]
    }
  }
}
对应的sql可以写成 age=32 and (gender =M or balance=19594) and account_number!=120
查询结果

改善bool查询,对于bool查询,可以采用range方式优化查询语句。如下

{
  "from": 0,
  "size": 100,
  "query": {
    "range": { #范围性查询  
      "age": {
        "gt": 32, #大于
        "lt": 50# 小于
      }
    }
  },
  "_source": "age"
}

采用range 属性查询可以替换掉将两个分离的should字句替换掉,现在可以将取值为minmum_should_match和should自居进行替换掉。


超越match和过滤器查询

  1. range查询和过滤器
    range查询用于范围搜索,设置上界和下届。
{
  "from": 0,
  "size": 10,
  "query": {
    "range": {
      "age": {
        "gt": 20,
        "lt":50 
      }
    }
  },
  "_source": "age"
}

2.prefix查询和过滤器
根据前缀进行查询,指定字段的包含索引文档

{
  "from": 0,
  "size": 10,
  "query": {
    "prefix": {
      "address": {
        "value": "7"
      }
    }
  }
}

3.wlidcard查询
wildcard查询作为正则表达式进行搜索,但是实际上可能更接进入shell脚本

{
  "from": 0,
  "size": 10,
  "query": {
    "wildcard": {
      "lastname": {
        "value": "b*d"
      }
    }
  }
}
wildcard查询

使用wildcard查询对于性能消耗过大,谨慎使用

4.exists过滤器

exists过滤器运行你过滤文档,只查找那些特定字段有值的文档。无论其值是多少。

{
  "from": 0,
  "size": 10,
  "query": {
    "exists": {#查询lastname有值的文档
      "field": "lastname"
    }
  },
  "_source": "lastname"
}
  1. 对于搜索狂查询我们可以采用match和query_string查询 进行检索
  2. match查询对于全文搜索而言是核心类型。但是query_string查询更为灵活,也更为复杂,因为它暴露了Lucence查询语法
  3. match查询有多个子类型,boolean、phrase、和phrase_prefix主要的区别在于boolean匹配单独的关键词,而phrase会考虑多个单词在词组的顺序。
  4. 像prefix和wildcard这样的特殊查询Es也是支持的
  5. exists过滤器恰恰相反,它可以返回拥有指定字段的文档
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容