首先向ES中插入几条数据:

PUT index3
PUT index3/user1/1
{
  "name":"water.zhou",
  "birthday":"1996-6-6",
  "interest":"swimming climbing walking",
  "address":"ShanDong province",
  "company":"yunzhihui",
  "height":178
}

POST index3/user1
{
  "name":"leo.liu",
  "birthday":"1997-5-1",
  "interest":"boxing computer walking",
  "address":"beijing chaoyangqu",
  "company":"tianji",
  "height":175
}

POST index3/user1
{
  "name":"leo.wang",
  "birthday":"1990-10-1",
  "interest":"computer food",
  "address":"beijing chaoyangqu",
  "company":"yunzhihui",
  "height":170
}

这里我们为第一条数据指定了ID,其他数据使用ES自动分配的ID。

1、简单字段查询和排序

GET index3/user1/_search?q=name:water.zhou  //按name查找

GET index3/user1/_search?q=interest:computer&sort=height:asc    //按interest查找,并按照height升序排序

2、query条件查询

2.1、term、terms、分页查询

term、terms查询, query会去倒排索引中寻找确切的term,它并不知道分词器的存在,这种查询适合keyword、numeric、date等明确值的

分页: from、size,from  从第几条数据开始展示,size 一页展示多少条数据

//term:查询某个字段里含有某个关键词的文档
GET index3/user1/_search
{
  "query":{
    "term":{"company":"yunzhihui"}
  }
}


//terms:查询某个字段里含有多个关键词的文档
GET index3/user1/_search
{
  "query":{
    "terms":{
      "interest":["computer","walking"]
    }
  }
}


GET index3/user1/_search
{
  "from": 2,  //从第三条开始展示,索引从0开始计
  "size":10,  //展示10条
  "query":{
    "terms":{
      "interest":["computer","walking"]
    }
  }
}

2.2、 match、march_all查询

match, query 知道分词器的存在,会对field进行分词操作,然后再查询,它和term区别可以理解为term是精确查询,这边match模糊查询。match_all用来查询全部。

GET index3/user1/_search
{
  "query":{
    "match": {
      "interest": "computer walking"
    }
  }
}


GET _search
{
  "query": {
    "match_all": {}
  }
}

查询结果:

可以看出查询结果中,只要interest字段中包含有computer或walking的数据,都会被查询到。这也说明,match查询时,会将查询条件进行分词。但是这里match查询能指定的查询的条件,只能有一个,如果我们要查询同事满足两个字段如interest和address两个字段,match就无法满足。

2.3、multi_match、match_phrase_prefix  和 match_phrase

multi_match可以指定多个查询字段,同match一样,query会对field进行分词操作,然后再查询;match_phrase_prefix 前缀匹配;match_phrase用于匹配短语查询,属于精确匹配,不会对field进行分词。

GET index3/user1/_search
{
  "query":{
    "multi_match": {
      "query": "shandong computer",
      "fields": ["interest","address"]
    }
  }
}


GET index3/user1/_search
{
  "query": {
    "match_phrase": {
      "address": "beijing chaoyangqu"
    }
  }
}

GET index3/user1/_search
{
  "query":{
    "match_phrase_prefix": {
      "address": "beijing"   //匹配address前缀为beijing的数据
    }
  }
}

查询的结果分别为:

2.4、_source: 指定查询结果要展示的字段;sort:排序,指定排序字段和排序方式

GET index3/user1/_search
{
  "_source":["name","interest"],  //查询结果只展示name和interest字段
  "query":{
    "multi_match": {
      "query": "shandong computer",
      "fields": ["interest","address"]
    }
  }
}

// 或者可以使用下面这种方式
GET index3/user1/_search
{
  "_source":{
    "includes":["name","interest"],  // 包含哪些字段
    "excludes":["company"] //排除哪些字段,优先级高于includes
  }, 
  "query":{
    "multi_match": {
      "query": "shandong computer",
      "fields": ["interest","address"]
    }
  }
}

//排序
GET index3/user1/_search
{
  "_source":{
    "includes":["name","interest"],
    "excludes":["company"]
  }, 
  "query":{
    "multi_match": {
      "query": "shandong computer",
      "fields": ["interest","address"]
    }
  }, 
 "sort": [  //排序字段类型只能选数字类型,简写 "sort":[{"height":"desc"}]
    {
      "height": {
        "order": "desc"
      }
    }
  ]
}

2.5、范围查询,range

range用于查询某个字段值的范围,常用的属性有:from、to、gt、gte、lt、lte、include_lower、include_upper、boost(设置权重)

GET index3/user1/_search
{
  "query": {
    "range": {
      "height": {
        "gte": 170,
        "lte": 178
      }
    }
  }
}

2.6、通配符查询 wildcard

wildcard可以使用通配符查询,“ * ”和“ ? ”,同SQL中一样,“ * ” 代表任意多个字符, “ ? ”代表任意一个字符  

GET index3/user1/_search
{
  "query": {
    "wildcard": {
      "name": "*zhou"
    }
  }
}

2.7、模糊查询 fuzzy,也叫容错查询

ES中fuzzy模糊查询与sql中的模糊查询有所区别,这里的模糊查询是指我们只查某个字段的相似值,也可以查询出想要的数据。

GET index3/user1/_search
{
  "query": {
    "fuzzy": {
      "name":"wate.zhou"   //会查出来name = water.zhou 的数据
    }
  }
}

// 常用属性
GET index3/user1/_search
{
  "query": {
    "fuzzy": {
      "name":{
        "value":"wate.zhou",
        "boost": 1,       // 权重值,默认是1
        "prefix_length":"4"  // 指明区分分词项的共同前缀长度,默认是0
      }
    }
  }
}

2.8、高亮搜索, hightlight 指定高亮的字段

GET index3/user1/_search
{
  "query":{
    "match": {
      "interest": "computer,walking"
    }
  },
  "highlight": {
     "fields": {
        "interest": {}     //这里只能高亮match查询的字段
      }
  }
}

3、bool、Filter过滤查询

3.1、bool组合查询

bool用于实现组合过滤查询,bool中常用属性有must、should、must_not、filter

  • must: 必须匹配,相当于slql中的  and,计算相关度
  • should: 至少满足一条,相当于slql中的  or,计算相关度
  • must_not:必须不匹配,相当于slql中的  not,不计算相关度
  • filter: 过滤子句,必须匹配,不计算相关度

使用格式{"bool":{"must":[],"should":[],"must_not":[]}}

3.2、filter过滤查询

filter 与 query 对比:

  • filter,不需要计算相关度分数,不需要按照相关度分数进行排序,同时还有内置的自动cache最常使用filter的数据, 性能好
  • query,要计算相关度分数,按照分数进行排序,而且无法cache结果.
GET index3/user1/_search
{
  "query": {
    "bool": {
      "filter":{
        "match":{
            "name": "leo.liu"
            }
          }
      }
  } 
}


GET index3/user1/_search
{
  "query": {
    "bool": {
      "should": [
        {"match": {"name": "leo.wang"}}, 
        {"match": {"name": "water.zhou"}}
      ],
      "must": [
        {"term": {"birthday": "1996-6-6"}}
      ],
      "must_not": [
        {"term": {"address": "ShanDong province"}} 
      ]
    }
  }
}

3.3、字段非空过滤:exists

exists用于过滤非空字段,相当于sql中的  not null  查询。

GET index3/user1/_search
{
  "query": {
    "bool": {
      "filter": {
        "exists": {
          "field": "name"
        }
      }
    }
  }
}

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐