不朽
不朽
发布于 2023-10-27 / 5 阅读
0
0

ElashSearch 基础语法-8.0

ElashSearch 基础语法-8.0

1、CRUD

创建索引

索引与数据库中的表类似

#语法  PUT /索引名称
PUT /test_index

删除索引

#删除索引
DELETE /test_index

向索引中插入数据

#方法1、手动设置ID (如果已经存在相同的ID,则执行更新操作)
# PUT /索引名称/_doc/id值
PUT /test_index/_doc/1
{
  "name":"zhangsan",
  "age":"12"
}
#方法2、自动设置ID  使用POST提交
#POST /索引名称/_doc
POST /test_index/_doc
{
  "name":"zhangsan",
  "age":"12"
}

删除指定索引的数据

#删除索引数据 DELETE /索引名称/_doc/ID值
DELETE /test_index/_doc/1

#删除多条数据 ID值用逗号隔开(,)
DELETE /test_index/_doc/1,2,3,4

2、查询

查询索引下的所有数据

# GET /索引名称/_search (包含查询信息)
GET /test_index/_search

# 查询索引下某一ID值  (只返回数据内容)
GET /test_index/_doc/1

查询超时设置

超时机制,假设,查询1万条数据。需要10毫秒,设置超时时间为1毫秒,当到达超时时间后,立即停止查询,并返回当前查询到的数据

#方法1:  通过参数进行设置(注意;超时单位 s/ms/m)
GET /test_index/_search?timeout=1ms
#方法2:  在消息体中设置(注意;超时单位)
GET /test_index/_search
{
  "timeout": "1ms"
}

URL中带参数查询

#get /索引/_search?q=对象属性名:值
GET /test_index/_search?q=age:45

分页查询

# GET /索外名称/_search?
# from=起始条数
# size=每页多少数据
# sort=排序规则:asc或desc (注意mapping中的字段类型,部分类型不允许排序)

GET /test_index/_search?from=0&size=2&sort=age.keyword:desc

#显示如下错误,代表字段类型不允许排序
Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [age] in order to load field data by uninverting the inverted index. Note that this can use significant memory

3、 查询DSL

匹配所有

#match_all 查询所有数据

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

单字段匹配match

#match 中设置相关的字段与数据
#match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找

GET /test_index/_search
{
  "query": {
    "match": {
      "name": "my name is bl"
    }
  }
}

match匹配完成后会将"my name is bl"分成 my name is bl 4个词进行查找。

单字段匹配term

#term 会直接对关键词进行查找
#如: my name is bl 会直接当成一个词“my name is bl”
#    match 会分成4个词
GET /test_index/_search
{
  "query": {
    "term": {
      "name": "zhang"
    }
  }
}

多字段匹配multi_match

# 多个字段根据query中的内容进行匹配
# 如下:
#   分别查询 name字段和desc字段中包含 query查询中的内容 (内容作分词处理)
GET /test_index/_search
{
  "query": {
    "multi_match": {
      "query": "查询的内容",
      "fields": ["name","desc"]
    }
  }
}

排序sort

#sort 排序

GET /test_index/_search
{
  "sort": [
    {
      "age.keyword": {
        "order": "desc"
      }
    }
  ]
}

返回指定的字段_source

#设置查询返回的字段内容
# 只返回name和age字段
GET /test_index/_search
{
  "query": {
    "match_all": {}
  },
  "_source": [
    "name","age"
  ]
}

分页查询 from fro

# from,起始条数 总共多少条数据
GET /test_index/_search
{
  "from": 0,
  "size": 10
}

match_phrase 短语搜索

# match_phrase 将数据分词后进行搜索的
#    1、目标文档需要包含分词后的所有词
#    2、目标文档还要保持这些词的相对顺序和文档中的一致
#    3、只有当这三个条件满足,才会命中文档!
#
# 而不像 match那样,将"li zhang san"分成三个词进行探索
GET /test_index/_search
{
  "query": {
    "match_phrase": {
      "name": "li zhang san"
    }
  }
}

4、 查询和过滤

must:必须满足子句(查询)必须出现在匹配的文档中,并将有助于得分。
filter:过滤器不计算相关分数 子句(查询)必须出现在匹配的文档中。但是不像 must查询的分数将被忽略。Filter子句在filter上下文中执行,这意味着计分被忽略,并且子句被考虑用于缓存。
should:可能满足 子句(查询)应出现在匹配的文档中。
must_not:必须不满足 不计算相关度分数 子句(查询)不得出现在匹配的文档中。子句在过滤器上下文中执行,这意味着计分被忽略,并且子句被视为用于缓存。由于忽略计分,0因此将返回所有文档的分数。
minimum_should_match 参数指定should返回的文档必须匹配的子句的数量或百分比。如果bool查询包含至少一个should子句,而没有must或 filter子句,则默认值为1。否则,默认值为0
例:#首先筛选name包含“xiaomi phone”并且价格大于1999的数据(不排序),#然后搜索name包含“xiaomi”and desc 包含“shouji”

GET /test_index/_search
{
  "query": {
    "bool": {
      "must": [   # name 包含xiaomi  and desc包含 shouji
        {
          "match": {
            "name": "xiaomi"
          }
        },
        {
          "match": {
            "desc": "shouji"
          }
        }
      ], 
      "filter": [ # name中包含 "xiaomi phone" and 价格大于 1999
        {
          "match_phrase":{
            "name":"xiaomi phone"
          }
        },
        {
          
          "range": {
            "price": {
              "gte": 1999
            }
          }
        }
      ]
    }
  }
}
#bool多条件 name包含xiaomi 不包含erji 描述里包不包含nfc都可以,价钱要大于等于4999
GET /product/_search
{
  "query": {
"bool":{
#name中必须不能包含“erji”
      "must": [
        {"match": { "name": "xiaomi"}}
      ],
#name中必须包含“xiaomi”
      "must_not": [
        {"match": { "name": "erji"}}
      ],
#should中至少满足0个条件,参见下面的minimum_should_match的解释
      "should": [
        {"match": {
          "desc": "nfc"
        }}
      ], 
#筛选价格大于4999的doc
      "filter": [		
        {"range": {
          "price": {
            "gt": 4999   
          }
        }}
      ]
    }
  }
}

Highlight search 显示

GET /test_index/_search
{
  "query": {
    "match": {
      "name": "zhang"
    }
  },
  "highlight": {
    "fields": {
      "name": {
        "pre_tags": [
          "<h1>"
        ],
        "post_tags": [
          "</h1>"
        ]
      }
    }
  }
}

游标查询:查询完成后返回scroll_id,在指定时间范围内,根据scroll_id即可查询下一组数据

#第一次返回内容
GET /test_index/_search?scroll=1m
{
  "size": 1
}

#第一次返回内容
{
  "_scroll_id" : "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFlozTXlNbXlzUXYtdklzQWtvVHcxeWcAAAAAAABt3hZqeV9pWEh4cVROcUtDVXMzWHB0cjdR",
  "took" : 0,
  "timed_out" : false,
  #其他返回内容忽略
}

#第二次查询,直接根据scroll_id进行查询
GET /_search/scroll
{
    "scroll":"1m",
    "scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFlozTXlNbXlzUXYtdklzQWtvVHcxeWcAAAAAAABt3hZqeV9pWEh4cVROcUtDVXMzWHB0cjdR"
}

#第二次返回内容
{
  "_scroll_id" : "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFlozTXlNbXlzUXYtdklzQWtvVHcxeWcAAAAAAABt3hZqeV9pWEh4cVROcUtDVXMzWHB0cjdR",
  "took" : 20,
  "timed_out" : false,
  #其他返回内容忽略
}

评论