elasticsearch 基本语法(常见的RESTFUL API)

一 . ES的基本语法


测试数据内容:

PUT /product/_doc/1
{
    "name" : "xiaomi phone",
    "desc" :  "shouji zhong de zhandouji",
    "price" :  3999,
    "tags": [ "xingjiabi", "fashao", "buka" ]
}
PUT /product/_doc/2
{
    "name" : "xiaomi nfc phone",
    "desc" :  "zhichi quangongneng nfc,shouji zhong de jianjiji",
    "price" :  4999,
    "tags": [ "xingjiabi", "fashao", "gongjiaoka" ]
}


PUT /product/_doc/3
{
    "name" : "nfc phone",
    "desc" :  "shouji zhong de hongzhaji",
    "price" :  2999,
    "tags": [ "xingjiabi", "fashao", "menjinka" ]
}

PUT /product/_doc/4
{
    "name" : "xiaomi erji",
    "desc" :  "erji zhong de huangmenji",
    "price" :  999,
    "tags": [ "low", "bufangshui", "yinzhicha" ]
}

PUT /product/_doc/5
{
    "name" : "hongmi erji",
    "desc" :  "erji zhong de kendeji",
    "price" :  399,
    "tags": [ "lowbee", "xuhangduan", "zhiliangx" ]
}
1.Query String 语法

timeout - - - 设置超时时间

GET /_search?timeout=1s

eq 语法

GET /_search/?q=name:xiaomi

③ 分页    from= 第几页面&size=每页显示的个数&sort=price:asc
注意:

按照字段排序之后查询结果score为null

2.Query DSL 语法

match_all - – -匹配所有

#匹配所有
GET /product/_search
{
  "query":{
    "match_all":{}
  }
}

match - - -根据属性的值去匹配

#根据具体的内容匹配
GET /product/_search
{
  "query":{
    "match": {
      "name": "nfc"
    }
  }
}

multi_match —多个字段匹配

#多字段匹配
GET /product/_search
{
  "query":{
    "multi_match":{
    "query":"nfc",
    "fields":["name","desc"]
    }
  }
}

_source - - -元数据只查询指定的字段不查询所有的字段

GET /product/_search
{
  "query":{
    "match":{
    "name":"nfc"
    }
  },
  "_source":["name"]
}

查询结果

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 0.90928507,
    "hits": [
      {
        "_index": "product",
        "_id": "3",
        "_score": 0.90928507,
        "_source": {
          "name": "nfc phone"
        }
      },
      {
        "_index": "product",
        "_id": "2",
        "_score": 0.76209855,
        "_source": {
          "name": "xiaomi nfc phone"
        }
      }
    ]
  }
}

⑤ 分页 from size

# 分页
GET /product/_search
{
  "query":{
    "match_all": {}
  },
  "from":1,
  "size":2
}
3. Full-text queries 全文检索

query-term:查询字段不会被分词

#query-term
GET /product/_search
{
  "query":{
    "term": {
        "name":"nfc"
    }
  }
}

matchterm 的区别

  1. term查询name为“”“nfc phone”的结果
GET /product/_search
{
  "query":{
    "term": {
        "name":"nfc phone" --这里没有分词 所以查询不到结果 
    }
  }
}

termmatch的区别?
term 是完全匹配,也就是精确查询。搜索前不会对搜索词在进行分词。
match是模糊匹配,首先会对搜索词进行相应得分词,在进行查询。

analyze - - - 验证分词

#验证分词
GET /_analyze
{
  "analyzer":"standard",
  "text":"xiaomi nfc zhineng phone"
}

分词结果

{
  "tokens": [
    {
      "token": "xiaomi",
      "start_offset": 0,
      "end_offset": 6,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "nfc",
      "start_offset": 7,
      "end_offset": 10,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "zhineng",
      "start_offset": 11,
      "end_offset": 18,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "phone",
      "start_offset": 19,
      "end_offset": 24,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}
4. Phrase search 短语搜索

   短语搜索和全文搜索相反。举个例子“nfc phone”回座位一个短语去搜索

#短语搜索
GET /product/_search
{
  "query":{
    "match_phrase": {
      "name": "nfc phone"
    }
  }
}

搜索结果查的是name里面包含nfc phone的值
在这里插入图片描述

5.Query and filter 查询和过滤

bool:可以组合多个查询条件,bool查询也是采用 more_matches_is_better的机制,因此满足mustshould子句的文档将会合并起来计算分值。

  • must:必须满足

子句(查询)必须出现在匹配的文档中,并将有助于得分

  • filter:过滤器 不计算相关度分数

子句(查询)必须出现在匹配的文档中。但是不像must查询的分数将会被忽略。Filter子句在filter上下文中执行,这意味着计分被忽略,并且子句被考虑用户缓存。

  • should:可能满足等价于or

子句(查询)应出现在匹配的文档中。

  • must not:必须不满足 不计算相关度分数相当于 not的意思

子句(查询)不得出现在匹配的文档中。子句在过滤器上下文中执行,这意味着计分被忽略,并且子句被视为缓存。由于忽略计分,0因此将返回所有文档的分数。

  • minimun should match

顾名思义:最低匹配度,即条件在倒排索引中最低的匹配度。
a.传入参数为数字
b. 传入的参数为百分比
c. 组合方式
d. 多种组合条件

demo 案例

首先筛选出name包含“xiaomi phone” 并且价格大于1999的数据(不排序),然后搜索name包含“xiaomi” 和“desc”包含“shouji”

GET /product/_search
{
  "query":{
    "bool":{
      "must": [
        {"match": {"name": "xiaomi" }},
        {"match": {"desc": "shouji" }}
      ],
      "filter": [
        {"match_phrase":{"name":"xiaomi phone"}},
        {"range": {"price": {"gte": 1999}}}
      ]
    }
  }
}

查询结果
在这里插入图片描述

2.bool多条件 name包含xiaomi 不包含erji 描述里包不包含nfc都可以,price要大于等于4999

# bool多条件 name包含xiaomi 不包含erji 描述里包不包含nfc都可以,价钱要大于等于4999
GET /product/_search
{
  "query":{
    "bool":{
      "must": [{"match": {"name": "xiaomi"}}],
      "must_not": [{"match": {"name": "erji"}}],
      "should": [{"match": {"name": "nfc"}}],
      "filter": [
        {"range": {
          "price": {
            "gte": 4999
          }
        }}
      ]
    }
  }
}

查询显示
在这里插入图片描述
嵌套查询

  • minium should match :参数指定should返回的文档必须匹配子句的数量和百分百。如果bool查询包含至少一个should子句,而没有mustfilter子句,则默认值为1。否则,默认值为0

案例:筛选出name中包含nfc的,价格可以大于1999或者3999

#组合查询
GET /product/_search
{
  "query":{
    "bool":{
      "must": [
        {"match": {
          "name": "nfc"
        }}
      ],
      "should": [
        {"range": {
          "price": {
            "gt": 1999
            
          }
        }},
        {"range": {
          "price": {
            "gt": 3999
          }
        }}
      ],
      "minimum_should_match": 1
    }
  }
}

查询结果
在这里插入图片描述

6. Compound queries 查询

constant_score

constant_score:本意(常量分数),可以将一个不变的常量应用到所有匹配的文档中。它常用于只需要执行一个filter而没有其他查询(例如评分查询)的情况下。term查询被放置在constant_score中,转换成不评分的filter。这种方式可以用来只有filter的bool查询中。

相关性得分的计算规则:

每一个子查询都独自计算doc的相关性得分,一旦他们的得分被计算出来,bool查询就将这些得分进行合并并且返回一个代表整个bool操作的得分。

bool中只有filter操作,故使用constant_score代替了filter操作,且为每一个子查询设置了常量分数。

案例: 想要一台带NFC功能的 或者 小米的手机 但是不要耳机

GET /product/_search
{
  "query":{
    "constant_score": {
      "filter": {
        "bool": {
          "should":[
            {"term":{"name":"xiaomi"}},
            {"term":{"name":"nfc"}}
            ],
            "must_not":[
              {"term":{"name":"erji"}}
              ]
        }
      },
      "boost": 1.2
    }
  }
}

查询结果
在这里插入图片描述

constance_score 这种方式的查询影响的每个子查询的相关度分数,把每个子查询的相关度分数都设置为常量,忽略 TF/IDF 信息。

7.HighLight search(高亮显示)
# 高亮显示
GET /product/_search
{
  "query":{
    "match_phrase": {
      "name": "nfc phone"
    }
  },
  "highlight":{
   "fields": {
     "name":{}
   }
  }
}

查询显示
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨大脸I

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值