ElashSearch 基础语法 (ES 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 search

游标查询:查询完成后返回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,
  #其他返回内容忽略
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我理解你的问题是关于 Elasticsearch 8.0 Java API 中的 SearchResponse 类的使用。 SearchResponse 类是 Elasticsearch Java API 中的一个重要类,用于存储搜索请求的响应结果。可以通过该类获取搜索结果的各项信息,例如搜索结果的总数、搜索响应的状态信息以及搜索结果中的每个文档的具体信息。 在 Elasticsearch 8.0 中,可以通过以下方式创建 SearchResponse 对象: ``` SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); ``` 其中,searchRequest 是一个 SearchRequest 对象,用于定义搜索请求的具体参数,例如搜索的索引、搜索的查询语句等等。client 是 Elasticsearch 的客户端对象,通过该客户端对象可以执行各种 Elasticsearch 操作,包括搜索操作。 一旦执行搜索请求,就可以得到一个 SearchResponse 对象,可以通过该对象获取搜索结果的各项信息,例如搜索结果的总数: ``` long totalHits = response.getHits().getTotalHits().value; ``` 以上代码中,getHits() 方法返回一个 SearchHits 对象,该对象包含了所有搜索结果的详细信息。getTotalHits() 方法可以获取搜索结果的总数。value 属性可以获取具体的搜索结果总数值。 除了获取搜索结果的总数,还可以通过 SearchResponse 对象获取各个搜索结果的详细信息,例如搜索结果中第一个文档的具体信息: ``` SearchHit hit = response.getHits().getAt(0); String id = hit.getId(); String sourceAsString = hit.getSourceAsString(); ``` 以上代码中,getAt() 方法通过索引获取搜索结果中的具体文档信息。getId() 方法可以获取该文档的 ID 值,getSourceAsString() 方法可以获取该文档的具体内容。 以上是 Elasticsearch 8.0 Java API 中 SearchResponse 类的基本使用方法,希望可以帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值