Elasticsearch Java 客户端

Elasticsearch Java 客户端 是 Elasticsearch 官方提供的 SDK,用于在 Java 应用中与 Elasticsearch 集群进行通信。

它封装了 Elasticsearch 的 HTTP API,支持构建查询请求、执行查询、索引数据等操作。

常用查询类型的详细解析及其用法:

1. BoolQuery

作用:用于组合多个查询条件,是 Elasticsearch 中最常用的查询类型。

BoolQuery 允许组合多个子查询,并指定它们之间的逻辑关系,例如:

  • must:子查询必须满足(相当于逻辑 AND)。

  • should:子查询可以满足(相当于逻辑 OR),至少满足一个时提高匹配评分。

  • filter:子查询必须满足,但不会影响评分(相当于无评分的 AND)。

  • must_not:子查询必须不满足(相当于逻辑 NOT)。

操作方法

//创建一个 BoolQuery 的构建器对象,用于构建复杂的布尔查询(Boolean Query)。
BoolQuery.Builder boolQueryBuilder = new BoolQuery.Builder();
​
// must: 条件必须满足
boolQueryBuilder.must(m -> m.match(t -> t.field("title").query("Elasticsearch")));
​
// should: 条件可以满足(加权影响评分)
boolQueryBuilder.should(s -> s.match(t -> t.field("description").query("Java")));
​
// filter: 条件必须满足,但不影响评分
boolQueryBuilder.filter(f -> f.range(r -> r.field("price").gte(10).lte(100)));
​
// must_not: 条件必须不满足
boolQueryBuilder.mustNot(n -> n.term(t -> t.field("status").value("inactive")));
​
// 构建为 BoolQuery 对象
Query boolQuery = boolQueryBuilder.build()._toQuery();
/*
_toQuery() 方法是 Elasticsearch Java 客户端提供的一种转换方法,用于将具体查询(如 BoolQuery、MatchQuery)封装为通用的 Query 类型。
为什么需要 _toQuery()?
在 Elasticsearch 的 Java 客户端中,很多具体查询类型(如 BoolQuery、MatchQuery 等)都继承自 Query 或需要被封装为 Query 类型,以便兼容各种查询场景。例如:
SearchRequest 的 .query() 方法需要接受 Query 类型的参数。
_toQuery() 方法将具体查询类型适配为通用类型,便于统一处理。
*/

对应的 DSL

{
  "bool": {
    "must": [
      { "match": { "title": "Elasticsearch" } }
    ],
    "should": [
      { "match": { "description": "Java" } }
    ],
    "filter": [
      { "range": { "price": { "gte": 10, "lte": 100 } } }
    ],
    "must_not": [
      { "term": { "status": "inactive" } }
    ]
  }
}

2. MatchQuery

作用:用于全文检索,查询字段会被分词并匹配。

操作方法

Query matchQuery = Query.of(q -> q.match(m -> m
    .field("content") // 查询的字段
    .query("Elasticsearch Java client"))); // 查询的值

对应的 DSL

{
  "match": {
    "content": "Elasticsearch Java client"
  }
}

注意

  • match 查询支持模糊匹配,因为会对查询词进行分词后逐一匹配。

  • 适用于全文检索场景,如文章标题、内容等。


3. TermQuery

作用:用于精确匹配字段的值,字段不会分词,适用于关键词匹配。

操作方法

Query termQuery = Query.of(q -> q.term(t -> t
    .field("status") // 查询的字段
    .value("active"))); // 精确匹配的值

对应的 DSL

{
  "term": {
    "status": "active"
  }
}

注意

  • 适用场景:精确匹配,例如状态字段、ID、分类字段等。

  • 查询字段类型应该是 keywordinteger,因为这些类型不分词。


4. RangeQuery

作用:用于范围查询,适合数值、日期范围等场景。

操作方法

Query rangeQuery = Query.of(q -> q.range(r -> r
    .field("price") // 查询的字段
    .gte(10) // 大于等于
    .lte(100))); // 小于等于

对应的 DSL

{
  "range": {
    "price": {
      "gte": 10,
      "lte": 100
    }
  }
}

注意

  • 支持 gte(大于等于)、lte(小于等于)、gt(大于)、lt(小于)。

  • 适用于数值范围或时间范围查询。


5. NestedQuery

作用:用于查询嵌套字段,适合在嵌套文档中进行精确匹配或组合查询。

操作方法

Query nestedQuery = Query.of(q -> q.nested(n -> n
    .path("attributes") // 嵌套字段路径
    .query(nq -> nq.bool(b -> b
        .must(m -> m.term(t -> t.field("attributes.key").value("color")))
        .must(m -> m.term(t -> t.field("attributes.value").value("red")))))));

对应的 DSL

{
  "nested": {
    "path": "attributes",
    "query": {
      "bool": {
        "must": [
          { "term": { "attributes.key": "color" } },
          { "term": { "attributes.value": "red" } }
        ]
      }
    }
  }
}

注意

  • 嵌套字段是通过 nested 类型定义的,需要通过 path 指定路径。

  • 适用于具有嵌套结构的字段,例如产品属性、嵌套文档等。

总结

Elasticsearch Java 客户端中查询类型的常用操作:

查询类型功能适用场景
BoolQuery组合多个查询条件复杂查询,如“与、或、非”逻辑
MatchQuery全文检索,字段分词标题、内容等模糊匹配
TermQuery精确匹配,不分词ID、分类、状态字段等
RangeQuery范围查询数值、日期范围
NestedQuery嵌套查询嵌套文档(如产品属性)
### Elasticsearch Java 客户端使用教程 #### 创建 Maven 或 Gradle 项目并引入依赖项 为了能够顺利集成和使用Elasticsearch Java客户端,在构建工具中添加相应的依赖是必要的。对于Maven用户来说,可以在`pom.xml`文件里加入如下依赖声明[^3]: ```xml <dependency> <groupId>co.elastic.clients</groupId> <artifactId>elasticsearch-java</artifactId> <version>{latest-version}</version> </dependency> <!-- 如果需要支持JSON序列化/反序列化 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>{jackson-version}</version> </dependency> ``` 而对于Gradle用户,则应在`build.gradle`文件内指定这些库: ```groovy implementation 'co.elastic.clients:elasticsearch-java:{latest-version}' // JSON support (optional but recommended) implementation 'com.fasterxml.jackson.core:jackson-databind:{jackson-version}' ``` 请注意替换上述代码中的`{latest-version}`以及`{jackson-version}`为实际版本号。 #### 初始化客户端实例 创建一个新的Java类来初始化Elasticsearch客户端对象。这里展示如何通过RestClientBuilder建立连接,并设置基本的身份验证机制(如果适用)。此部分适用于7.17及以上版本的新版Java客户端: ```java import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.json.jackson.JacksonJsonpMapper; import co.elastic.clients.transport.rest_client.RestClientTransport; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; public class EsClientExample { public static void main(String[] args) throws Exception { RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")).build(); ElasticsearchClient client = new ElasticsearchClient( new RestClientTransport(restClient, new JacksonJsonpMapper())); // Your code here... restClient.close(); } } ``` 这段程序展示了怎样利用Apache HttpClient去搭建到本地运行着的单节点集群上的HTTP链接;同时也指定了Jackson作为默认的消息转换器用于处理请求与响应之间的数据交换过程。 #### 执行简单的索引操作 下面的例子演示了向名为`my-index`的索引中插入一条文档记录的方法。该文档包含了两个字段——`title` 和 `content`,它们分别代表文章标题及其正文内容[^1]。 ```java Map<String, Object> jsonMap = Map.of( "title", "My First Blog Post", "content", "This is the content of my first blog post." ); IndexResponse indexResponse = client.index(i -> i .index("my-index") .id("1") // Optional ID assignment; omitting it will auto-generate one. .document(jsonMap)); System.out.println(indexResponse.result()); ``` 以上就是有关于Elasticsearch Java客户端的一些基础知识点介绍及简单应用案例分享。希望这能帮助读者更好地理解和掌握这个强大的搜索引擎平台所提供的API接口和服务功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值