Elasticsearch ES操作:查询数据(全部、分页、单条、组合条件)

场景

        在使用ES时经常需要通过接口或者查询工具查找ES中的数据,需要了解基本的查询命令。      如精确查询,模糊匹配,多条件查询等。

操作

  • 查询

#默认返回10条
GET http://127.0.0.1:9200/user_index/_search
  • 条件查询
#全值匹配
GET http://127.0.0.1:9200/user_index/_search?q=_id:532

#包含
GET http://127.0.0.1:9200/user_index/_search?q=+name:李

#不包含
GET http://127.0.0.1:9200/user_index/_search?q=-name:李

#全文搜索
GET http://127.0.0.1:9200/user_index/_search?q=李
  • 指定条数
#返回指定条数
GET http://127.0.0.1:9200/user_index/_search?size=10

#指定数据的位置,一般分页中使用
GET http://127.0.0.1:9200/user_index/_search?size=10&from=10

#组合查询
GET http://127.0.0.1:9200/user_index/_search?q=+name:李&size=10
  • json格式
# 字段匹配
GET user_index/_search
{
  "_source": ["name", "age"], #显示字段
  "query":{
      "match":{
        "name": "lizz"
      }
  }
}
# 多条件匹配
GET user_index/_search
{
  "query": {
    "bool": {  # 是否为真
      "must": [ # 满足下列条件
        {"match": {"name": "lizz"}}, # name字段为lizz
        {"terms": {"code": [110,112,113]}}, # name字段为lizz
        {"range": {"createAt": { "gte": "2024-06-10T12:00:00", "lte": "2024-06-11" } } } # createAt时间范围
      ],
      "must_not": [ # 不满足下列调整
        { "exists": { "field": "idcard" } } #存在idcard字段
      ]
    }
  }
}
  • 分组统计
GET /users_lizz/_search
{
  "size": 0,
  "aggs": {
    "xzqh_count": { // 统计数量字段
      "terms": {
        "field": "xzqh", # 分组字段
        "size": 100  # 返回条数
      }
    }
  }
}

  • 返回结果
{
    "took": 35, #执行时间,毫秒数
    "timed_out": false, #查询是否超时
    "_shards": {
        "total": 1, #返回条数
        "successful": 1, #成功返回条数
        "skipped": 0, #跳过的数据条数
        "failed": 0 #失败的数据条数
    },
    "hits": {
        "total": {
            "value": 6963, #总条数
            "relation": "eq" #查询类型,eq=equal相等
        },
        "max_score": 0.7731953, # 返回数据中匹配最高分
        "hits": [
            {
                "_index": "qx_user", #索引名词
                "_type": "_doc", # 索引类型
                "_id": "6013584", # 数据id
                "_score": 0.7731953, # 数据分数
                "_source": {   # 数据内容
                    ...   
                }
            }
        ]
    }
}

Elasticsearch 中使用深度分页功能需要注意以下几点: 1. 尽量避免使用深度分页功能,因为它会增加网络和计算开销,可能导致性能问题。 2. 深度分页功能是通过设置 from 和 size 参数来实现的。from 参数表示从哪个位置开始查询,size 参数表示每页返回的文档数量。 3. Elasticsearch 默认最多只能返回 10000 条记录,如果需要查询更多的记录,需要设置 index.max_result_window 参数。但是设置太大会占用过多的内存,影响性能。 下面是一个 Java 实现 Elasticsearch 分页查询的示例代码: ``` import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.client.Client; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; public class ESQuery { private Client client; public ESQuery(Client client) { this.client = client; } public void search(String index, String type, int from, int size) { SearchResponse response = client.prepareSearch(index) .setTypes(type) .setQuery(QueryBuilders.matchAllQuery()) .addSort(SortBuilders.fieldSort("_id").order(SortOrder.DESC)) .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setFrom(from) .setSize(size) .execute() .actionGet(); SearchHits hits = response.getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); } } } ``` 调用示例: ``` ESQuery esQuery = new ESQuery(client); esQuery.search("my_index", "my_type", 0, 10); // 查询第一页,每页10条记录 esQuery.search("my_index", "my_type", 10, 10); // 查询第二页,每页10条记录,从第11条记录开始 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lizz666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值