es的检索-DSL语法和Java-RestClient实现

基本语法

json 复制代码
GET /索引库名/_search
{
  "query": {
    "查询类型": {"查询条件"}
  }
}

RestClient的导入在RestClient操作索引库和文档有介绍

查询所有

json 复制代码
# 查询所有
GET /test/_search
{
  "query": {
    "match_all": {}
  }
}
java 复制代码
SearchRequest request = new SearchRequest("test");
request.source().query(QueryBuilders.matchAllQuery());
SearchResponse response = client.search(request, RequestOptions.DEFAULT);

全文检索查询

对用户输入的内容进行分词,然后去倒排索引库进行检索,常用于搜索框

json 复制代码
# match查询
GET /test/_search
{
  "query": {
    "match": {
      "字段": "文本"
    }
  }
}
java 复制代码
SearchRequest request = new SearchRequest("test");
request.source().query(QueryBuilders.matchQuery("字段","文本"));
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
System.out.println(response.getHits().getTotalHits().value);
json 复制代码
# mutil_match查询
GET /test/_search
{
  "query": {
    "multi_match": {
      "query": "文本",
      "fields": ["字段1", "字段2", ...]
    }
  }
}

一般情况下,多字段查询都会copy_to到一个字段中,然后使用match查询来替代multi_match查询,能够提高查询效率。
精确查询

精确查询不会对搜索条件进行分词,一般查找keyword,数值,日期,boolean等字段。

  • trem :根据词条精确查找,类似于mysql的=
  • range :根据词条的范围查询。gt gte lt lte分别是大于 大于等于 小于 小于等于
json 复制代码
# term查询,查找price是8的文档
GET /test/_search
{
  "query": {
    "term": {
      "price": {
        "value": "8"
      }
    }
  }
}
# 查询price大于10并且小于20的文档
GET /test/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}
java 复制代码
SearchRequest request = new SearchRequest("test");
request.source().query(QueryBuilders.termQuery("字段","文本"));
request.source().query(QueryBuilders.rangeQuery("price").gt(1).lt(5))
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
System.out.println(response.getHits().getTotalHits().value);

Function Score Query

我们在使用match查询的时候,展示的文档的顺序会根据改文档与搜索词条的相关性(抽象为一个分数,es进行打分)进行排序。

而常见的相关性算法是TF-IDF和BM25:

在es5.0之前使用的是TF-IDF算法,而之后使用的是BM25算法。随着词频的增加,TF-IDF会无限变大,而BM25就比较稳定。

Function Score Query ,可以修改文档的相关性算分。

复合查询(Boolean Query)

java 复制代码
SearchRequest request = new SearchRequest("test");
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.matchAllQuery());// boolQuery.must(QueryBuilders.matchQuery("all", key));
boolQuery.filter(QueryBuilders.termQuery("字段","文本"));
String sortBy = params.getSortBy();
if (!sortBy.equals("default")) {
    request.source().sort(sortBy);
}
request.source().query(boolQuery);
Integer size = params.getSize();
Integer page = params.getPage();
request.source().from((page - 1) * size).size(size);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
相关推荐
Elasticsearch8 小时前
如何使用 OpenTelemetry 和 Elastic APM 追踪 MCP 服务器工具调用
elasticsearch
Elastic 中国社区官方博客13 小时前
Elastic 开源社区行为准则
大数据·elasticsearch·搜索引擎·信息可视化·全文检索
逸Y 仙X16 小时前
文章二十九:ElasticSearch分桶聚合
android·大数据·elasticsearch·搜索引擎·全文检索
Highcharts.js16 小时前
Highcharts React 5.0 正式版:支持 ES 模块化、组件更精简、开发体验全面升级
前端·javascript·react.js·elasticsearch·前端框架·highcharts
Elastic 中国社区官方博客17 小时前
通过项目标签和路由,在 Elasticsearch Serverless 中实现更快的跨项目搜索
大数据·elasticsearch·搜索引擎·云原生·serverless·全文检索
海兰17 小时前
使用 OpenTelemetry 与 Elastic APM 追踪 MCP 服务器工具调用
运维·服务器·elasticsearch·wpf
逆境不可逃18 小时前
一篇速通互联网架构的不断升级过程:从单机到云原生
java·elasticsearch·搜索引擎·云原生·架构
明明跟你说过1 天前
Kafka 与 Elasticsearch 的集成应用案例深度解析
大数据·elk·elasticsearch·kafka·big data·bigdata
拾-光1 天前
【Git】命令大全:从入门到高手,100 个最常用命令速查(2026 版)
java·大数据·人工智能·git·python·elasticsearch·设计模式
醉颜凉1 天前
Elasticsearch 实战:数据自动化清理完全指南(ILM + 定时删除 + 最佳实践)
elasticsearch·自动化·jenkins