【弄nèng - Elasticsearch】DSL入门篇(五)—— 常用查询

Dsl基础查询语句事例

1. term、terms查询

term:精确查看关键字,不使用分词器。常用于keyword,date, int等类型字段。

POST schools/classes/_search
{
  "query": {
    "term": {
      "classes_id": 4
    }
  }
}

terms:精确查看某个字段里面拥有多个关键字,相当于sql中in。

POST schools/classes/_search
{
  "query": {
    "terms": {
      "classes_id": [1,4]
    }
  }
}

2. match查询

match:使用分词器分割单词后在进行查询,常用于text类型字段。

POST schools/classes/_search
{
  "query":{
  	"match": {
   	  "name": "班级4"
    } 
  }
}

match会将name拆分成“班级”和4,只要文档name中含有“班级”或者4就会被查出来

3. match_all查询

match_all:查询所有文档

POST schools/classes/_search
{
  "query": {
    "match_all": {}
  }
}

4. multi_match查询

multi_match:指定多个字段

POST schools/classes/_search
{
  "query": {
    "multi_match": {
      "query" : "班级",
      "fields":  ["name","address"] 
    }
  }
}

只要name或者address中一个含有“班级”就会被查出

5. match_phrase短语匹配

match_phrase:短语匹配查询,跟match的区别是,当查询“my name”短语时,match会分割成“my” 和 “name” 只要有一个匹配就行,而match_phrase必须匹配“my name”才能被查出。

5.1 查询keyword

如果查询字段类型是keyword,那么必须完全匹配才能被查出来
例如元数据如下,address是keyword类型,name是text类型

{
   "classes_id": 4,
   "name": "班级4",
   "address": "6-深圳市福田区福华路1",
   "price": 2.4,
   "timestamp": 1572577260000
 }   

查询

POST schools/classes/_search
{
  "query": {
    "match_phrase": {
      "address": "6-深圳市福田区福华路1"
    }
  }
}

5.2 查询text

如果查询字段类型是text,那么name字段中只要包含“班级”这个短语就能被查出

POST schools/classes/_search
{
  "query": {
    "match_phrase": {
      "name": "班级"
    }
  }
}

5.3 slot

对于匹配了短语"my name is"的文档,下面的条件必须为true:

  • my, name和is必须全部出现在某个字段中。
  • name的位置必须比my的位置大1。
  • is的位置必须比my的位置大2。

slop参数: match_phrase查询词条能够相隔多远时仍然将文档视为匹配。

POST schools/classes/_search
{
  "query": {
    "match_phrase": {
      "name": {
          "query": "班级 1",
          "slop":  1
      }
    }
  }
}

slot设置成1代表 "班级 1"的短语能匹配到"班级1"的文档,哪怕相差一个位置

6. prefix前缀查询

multi_match:查询指定前缀的文档

POST schools/classes/_search
{ 
  "query": {
    "prefix": {
      "name":"班级"
    }
  }
}

7. fuzzy模糊查询

multi_match:自动将拼写错误的搜索文本进行纠正
参数

  • fuzziness:搜索文本最多可以纠正几个字母去跟你的数据进行匹配,默认如果不设置,为2
  • min_similarity:设置匹配的最小相似度,默认值0.5,对于字符串,取值0-1(包括0和1);对于数值,取值可能大于1;对于日期取值为1d,1m等,1d等于1天
POST schools/classes/_search
{ 
  "query": {
    "fuzzy": {
      "address": {
        "value": "-深圳市福田区福华路",
        "fuzziness": 2
      }
    }
  }
}

8. 通配符查询

wildcard:支持* 或者 ?等通配符 ,* 代表多个字符,?代表一个字符

POST schools/classes/_search
{
  "query": {
    "wildcard": {
      "address": "6-深圳市福田区*"
    }
  }
}

9. 正则表达式查询

regexp:查询允许您使用正则表达式进行项查询

POST schools/classes/_search
{
  "query": {
    "regexp":{
      "name":{
          "value":"班.*"
      }
    }
  }
}

10. query_string查询( 支持lucene的查询语法 )

query_string:支持lucene的查询语法
参数:

  • query: 需要查询的具体内容
  • default_field: 查询的字段
  • default_operator:默认运算符
  • analyzer:分析器
  • minimum_should_match: 最小匹配词条
POST schools/classes/_search
{
  "query": {
    "query_string": {
      "query":"(班级 AND 6) OR 1",
      "default_field":"name"
    }
  }
}

返回name中包含 “班级”和“6” 或者“1”的文档

11. range查询

range:范围查询

POST schools/classes/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

12. _source, sort

_source:指定返回字段
sort::排序

{
  "_source":["name"],  
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "timestamp": {
        "order": "desc"
      }
    }
  ]
}

12. cardinality

去重查询,类似于sql的distinct

如下事例返回name唯一的个数,类似于SELECT COUNT(DISTINCT name) FROM users

POST twitter/tweet/_search
{
    "size" : 0,
    "aggs" : {
        "distinct_name" : {
            "cardinality" : {
              "field" : "name"
            }
        }
    }
}

13. constant_score

在 Elasticsearch 中, 相关性得分 由一个浮点数进行表示,并在搜索结果中通过 _score 参数返回, 默认排序是 _score 降序。
如果我们不关心相关性评分,可以使用constant_score 包装filter和query,并返回每个匹配的文档,其相关性得分等于boost参数值。

POST twitter/tweet/_search
{
    "query": {
        "constant_score" : {
            "filter" : {
                "term" : { "name" : "SIMA"}
            },
            "boost" : 1.2
        }
    }
}

效果

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1.2,
    "hits": [
      {
        "_index": "twitter",
        "_type": "tweet",
        "_id": "3",
        "_score": 1.2,
        "_source": {
          "name": "SIMA",
          "message": "1asda爱上大声大声大声道1",
          "postDate": 1574874999000,
          "title": "黑龙江省北安市"
        }
      }
    ]
  }
}

13. script query

通过脚本查询,语法跟版本有关

POST twitter/tweet/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "script": {
            "script": "doc['price'].value > 1"
          }
        }
      ]
    }
  }
}

项目推荐

IT-CLOUD :IT服务管理平台,集成基础服务,中间件服务,监控告警服务等。
IT-CLOUD-ACTIVITI6 :Activiti教程源码。博文在本CSDN Activiti系列中。
IT-CLOUD-ELASTICSEARCH :elasticsearch教程源码。博文在本CSDN elasticsearch系列中。

开源项目,持续更新中,喜欢请 Star~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值