Elasticsearch Java API Client queryString 语法案例

这段代码展示了如何构造一个`SearchRequest`,将JSON查询(来自`queryJson`对象)编码并应用于Elasticsearch的搜索操作,包括指定索引、类型、起始位置和返回结果数量。
public SearchResponse search(String index, String type, JSONObject queryJson) throws IOException {
        String encodedJSON = Base64.getEncoder().encodeToString(queryJson.getJSONObject("query").toJSONString().getBytes());
        SearchRequest searchRequest = SearchRequest.of(s-> s.index(index)
                .query(b0 -> b0.wrapper(b1 -> b1
                        .query(encodedJSON)))
                .from(queryJson.getIntValue("from"))
                .size(queryJson.getIntValue("size")));
        return client.search(searchRequest, JSONObject.class);
    }
参考这个工具类package org.jeecg.common.es; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.jeecg.common.util.RestUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.Set; /** * 关于 ElasticSearch 的一些方法(创建索引、添加数据、查询等) * * @author sunjianlei */ @Slf4j @Component public class JeecgElasticsearchTemplate { /** * 用户配置是否通过,未通过就不走任何方法 */ private static boolean configIsPassed = true; /** * 是否已检测过配置 */ private static boolean configIsChecked = false; private String baseUrl; private final String FORMAT_JSON = "format=json"; public JeecgElasticsearchTemplate(@Value("${jeecg.elasticsearch.cluster-nodes}") String baseUrl) { log.debug("JeecgElasticsearchTemplate BaseURL:" + baseUrl); // 未检测过配置,进行检测操作 if (!configIsChecked) { configIsChecked = true; // 为空则代表未配置 baseUrl if (StringUtils.isEmpty(baseUrl)) { configIsPassed = false; } else { this.baseUrl = baseUrl; // 判断配置的地址是否有效 try { RestUtil.get(this.getBaseUrl().toString()); } catch (Exception e) { configIsPassed = false; } } if (configIsPassed) { log.info("ElasticSearch服务连接成功"); } else { log.warn("ElasticSearch 服务连接失败,原因:配置未通过。可能是BaseURL未配置或配置有误,也可能是Elasticsearch服务未启动。接下来将会拒绝执行任何方法!"); } } } /** * 检查配置是否通过,未通过就抛出异常,中断执行 */ private void checkConfig() { if (!configIsPassed) { throw new RuntimeException("配置未通过,拒绝执行该方法"); } } public StringBuilder getBaseUrl(String indexName, String typeName) { typeName = typeName.trim().toLowerCase(); return this.getBaseUrl(indexName).append("/").append(typeName); } public StringBuilder getBaseUrl(String indexName) { indexName = indexName.trim().toLowerCase(); return this.getBaseUrl().append("/").append(indexName); } public StringBuilder getBaseUrl() { return new StringBuilder("http://").append(this.baseUrl); } /** * cat 查询ElasticSearch系统数据,返回json */ public <T> ResponseEntity<T> _cat(String urlAfter, Class<T> responseType) { this.checkConfig(); String url = this.getBaseUrl().append("/_cat").append(urlAfter).append("?").append(FORMAT_JSON).toString(); return RestUtil.request(url, HttpMethod.GET, null, null, null, responseType); } /** * 查询所有索引 * <p> * 查询地址:GET http://{baseUrl}/_cat/indices */ public JSONArray getIndices() { this.checkConfig(); return getIndices(null); } /** * 查询单个索引 * <p> * 查询地址:GET http://{baseUrl}/_cat/indices/{indexName} */ public JSONArray getIndices(String indexName) { this.checkConfig(); StringBuilder urlAfter = new StringBuilder("/indices"); if (!StringUtils.isEmpty(indexName)) { urlAfter.append("/").append(indexName.trim().toLowerCase()); } return _cat(urlAfter.toString(), JSONArray.class).getBody(); } /** * 索引是否存在 */ public boolean indexExists(String indexName) { this.checkConfig(); try { JSONArray array = getIndices(indexName); return array != null; } catch (org.springframework.web.client.HttpClientErrorException ex) { if (HttpStatus.NOT_FOUND == ex.getStatusCode()) { return false; } else { throw ex; } } } /** * 创建索引 * <p> * 查询地址:PUT http://{baseUrl}/{indexName} */ public boolean createIndex(String indexName) { this.checkConfig(); String url = this.getBaseUrl(indexName).toString(); /* 返回结果 (仅供参考) "createIndex": { "shards_acknowledged": true, "acknowledged": true, "index": "hello_world" } */ try { return RestUtil.put(url).getBoolean("acknowledged"); } catch (org.springframework.web.client.HttpClientErrorException ex) { if (HttpStatus.BAD_REQUEST == ex.getStatusCode()) { log.warn("索引创建失败:" + indexName + " 已存在,无需再创建"); } else { ex.printStackTrace(); } } return false; } /** * 删除索引 * <p> * 查询地址:DELETE http://{baseUrl}/{indexName} */ public boolean removeIndex(String indexName) { this.checkConfig(); String url = this.getBaseUrl(indexName).toString(); try { return RestUtil.delete(url).getBoolean("acknowledged"); } catch (org.springframework.web.client.HttpClientErrorException ex) { if (HttpStatus.NOT_FOUND == ex.getStatusCode()) { log.warn("索引删除失败:" + indexName + " 不存在,无需删除"); } else { ex.printStackTrace(); } } return false; } /** * 保存数据,详见:saveOrUpdate */ public boolean save(String indexName, String typeName, String dataId, JSONObject data) { this.checkConfig(); return this.saveOrUpdate(indexName, typeName, dataId, data); } /** * 更新数据,详见:saveOrUpdate */ public boolean update(String indexName, String typeName, String dataId, JSONObject data) { this.checkConfig(); return this.saveOrUpdate(indexName, typeName, dataId, data); } /** * 保存或修改索引数据 * <p> * 查询地址:PUT http://{baseUrl}/{indexName}/{typeName}/{dataId} * * @param indexName 索引名称 * @param typeName type,一个任意字符串,用于分类 * @param dataId 数据id * @param data 要存储的数据 * @return */ public boolean saveOrUpdate(String indexName, String typeName, String dataId, JSONObject data) { this.checkConfig(); String url = this.getBaseUrl(indexName, typeName).append("/").append(dataId).toString(); /* 返回结果(仅供参考) "createIndexA2": { "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 0, "_index": "test_index_1", "_type": "test_type_1", "_id": "a2", "_version": 1, "_primary_term": 1 } */ try { // 去掉 data 中为空的值 Set<String> keys = data.keySet(); List<String> emptyKeys = new ArrayList<>(keys.size()); for (String key : keys) { String value = data.getString(key); if (StringUtils.isEmpty(value)) { emptyKeys.add(key); } } for (String key : emptyKeys) { data.remove(key); } } catch (Exception e) { e.printStackTrace(); } String result = RestUtil.put(url, data).getString("result"); return "created".equals(result) || "updated".equals(result); } /** * 删除索引数据 * <p> * 请求地址:DELETE http://{baseUrl}/{indexName}/{typeName}/{dataId} */ public boolean delete(String indexName, String typeName, String dataId) { this.checkConfig(); String url = this.getBaseUrl(indexName, typeName).append("/").append(dataId).toString(); /* 返回结果(仅供参考) { "_index": "es_demo", "_type": "docs", "_id": "001", "_version": 3, "result": "deleted", "_shards": { "total": 1, "successful": 1, "failed": 0 }, "_seq_no": 28, "_primary_term": 18 } */ try { return "deleted".equals(RestUtil.delete(url).getString("result")); } catch (org.springframework.web.client.HttpClientErrorException ex) { if (HttpStatus.NOT_FOUND == ex.getStatusCode()) { return false; } else { throw ex; } } } /* = = = 以下关于查询和查询条件的方法 = = =*/ /** * 查询数据 * <p> * 请求地址:POST http://{baseUrl}/{indexName}/{typeName}/_search */ public JSONObject search(String indexName, String typeName, JSONObject queryObject) { this.checkConfig(); String url = this.getBaseUrl(indexName, typeName).append("/_search").toString(); log.info("search: " + queryObject.toJSONString()); return RestUtil.post(url, queryObject); } /** * 查询数据 * <p> * 请求地址:POST http://{baseUrl}/{indexName}/{typeName}/_search */ public JSONObject mapping(String indexName, String typeName, JSONObject queryObject) { this.checkConfig(); String url = this.getBaseUrl(indexName, typeName).append("/_mapping").toString(); log.info("search: " + queryObject.toJSONString()); return RestUtil.post(url, queryObject); } /** * @return { "query": query } */ public JSONObject buildQuery(JSONObject query) { JSONObject json = new JSONObject(); json.put("query", query); return json; } /** * @return { "bool" : { "must": must, "must_not": mustNot, "should": should } } */ public JSONObject buildBoolQuery(JSONArray must, JSONArray mustNot, JSONArray should) { JSONObject bool = new JSONObject(); if (must != null) { bool.put("must", must); } if (mustNot != null) { bool.put("must_not", mustNot); } if (should != null) { bool.put("should", should); } JSONObject json = new JSONObject(); json.put("bool", bool); return json; } /** * @param field 要查询的字段 * @param args 查询参数,参考: *哈哈* OR *哒* NOT *呵* OR *啊* * @return */ public JSONObject buildQueryString(String field, String... args) { if (field == null) { return null; } StringBuilder sb = new StringBuilder(field).append(":("); if (args != null) { for (String arg : args) { sb.append(arg).append(" "); } } sb.append(")"); return this.buildQueryString(sb.toString()); } /** * @return { "query_string": { "query": query } } */ public JSONObject buildQueryString(String query) { JSONObject queryString = new JSONObject(); queryString.put("query", query); JSONObject json = new JSONObject(); json.put("query_string", queryString); return json; } /** * @param field 查询字段 * @param min 最小值 * @param max 最大值 * @param containMin 范围内是否包含最小值 * @param containMax 范围内是否包含最大值 * @return { "range" : { field : { 『 "gt『e』?containMin" : min 』?min!=null , 『 "lt『e』?containMax" : max 』}} } */ public JSONObject buildRangeQuery(String field, Object min, Object max, boolean containMin, boolean containMax) { JSONObject inner = new JSONObject(); if (min != null) { if (containMin) { inner.put("gte", min); } else { inner.put("gt", min); } } if (max != null) { if (containMax) { inner.put("lte", max); } else { inner.put("lt", max); } } JSONObject range = new JSONObject(); range.put(field, inner); JSONObject json = new JSONObject(); json.put("range", range); return json; } } 写一个添加映射方法
最新发布
08-08
<think>首先,用户的问题是:“我想在Elasticsearch中添加映射的Java方法实现 请问Java代码实现Elasticsearch添加映射的方法”。这看起来是关于使用Java APIElasticsearch中添加映射的。 根据系统级指令,我需要: - 使用$...$格式处理行内数学表达式(但这里可能没有数学表达式)。 - 独立公式使用$$...$$格式(同样,可能不适用)。 - 确保LaTeX语法正确(但这里可能不需要)。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 参考提供的引用: - 引用[1]:Elasticsearch——使用Java API实现ES中的索引、映射、文档操作。链接到博客文章。 - 引用[2]:Elasticsearch基本语法Java代码操作,包括一个映射示例。 用户的问题具体是添加映射的Java方法实现。所以,我需要提供Java代码示例来展示如何添加映射。 关键点: - 在Elasticsearch中,映射定义了索引中的文档结构,包括字段类型等。 - 使用Java API,可以通过ElasticsearchJava High Level REST Client或Low Level Client来实现。 步骤: 1. **引入依赖**:首先,需要添加Elasticsearch Java客户端依赖。 2. **创建客户端**:连接到Elasticsearch集群。 3. **定义映射**:使用JSON格式或Java对象来定义映射。 4. **发送请求**:使用API发送PUT请求来创建或更新映射。 从引用[2]中,有一个映射示例: ```json PUT /hotel { "mappings": { "properties": { "id": { "type": "keyword" }, "name": { "type": "text", "analyzer": "ik_max_word", "copy_to": "all" }, // ...其他字段 } } } ``` 在Java中,可以使用`org.elasticsearch.client.RequestOptions`和`org.elasticsearch.client.RestHighLevelClient`等类。 示例Java代码: ```java import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.xcontent.XContentType; public class ElasticsearchMappingExample { public static void main(String[] args) { try (RestHighLevelClient client = createClient()) { CreateIndexRequest request = new CreateIndexRequest("hotel"); String mapping = "{\n" + " \"properties\": {\n" + " \"id\": { \"type\": \"keyword\" },\n" + " \"name\": { \"type\": \"text\", \"analyzer\": \"ik_max_word\", \"copy_to\": \"all\" },\n" + " \"address\": { \"type\": \"keyword\", \"index\": false },\n" + " \"price\": { \"type\": \"integer\" },\n" + " \"score\": { \"type\": \"integer\" },\n" + " \"brand\": { \"type\": \"keyword\", \"copy_to\": \"all\" },\n" + " \"city\": { \"type\": \"keyword\" },\n" + " \"starName\": { \"type\": \"keyword\" },\n" + " \"business\": { \"type\": \"keyword\", \"copy_to\": \"all\" },\n" + " \"location\": { \"type\": \"geo_point\" },\n" + " \"pic\": { \"type\": \"keyword\", \"index\": false },\n" + " \"all\": { \"type\": \"text\", \"analyzer\": \"ik_max_word\" }\n" + " }\n" + "}"; request.mapping(mapping, XContentType.JSON); CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT); if (response.isAcknowledged()) { System.out.println("索引和映射创建成功!"); } } catch (Exception e) { e.printStackTrace(); } } private static RestHighLevelClient createClient() { // 实现创建客户端的逻辑,例如: // RestHighLevelClient client = new RestHighLevelClient( // RestClient.builder(new HttpHost("localhost", 9200, "http"))); // return client; return null; // 简化示例 } } ``` 注意: - 这只是一个示例代码。实际中需要处理异常、关闭客户端等。 - 映射可以通过字符串直接提供,或者使用Java对象如`Map<String, Object>`。 回答结构: 1. **介绍**:简要解释映射是什么。 2. **步骤**:分步骤说明如何实现。 3. **代码示例**:提供完整的Java代码示例。 4. **注意事项**:提醒依赖、异常处理等。 5. **生成相关问题**:在最后添加相关问题。 引用: - 由于用户提供了引用[1]和[2],我应该在回答中自然地引用它们。例如,在解释时提到引用[2]的映射示例。 相关问题: - 基于用户的问题,生成相关的问题,如: 1. 如何在Java中更新现有索引的映射? 2. Elasticsearch映射的常见字段类型有哪些? 3. 如何处理映射冲突? 最后,确保整个回答用中文。</think>### Java代码实现Elasticsearch添加映射的方法 在Elasticsearch中,映射(Mapping)定义了索引中字段的数据类型、分词器和其他属性。使用Java API添加映射时,主要通过`RestHighLevelClient`发送创建索引的请求,并在请求中嵌入映射定义。以下是逐步实现的详细说明和代码示例: --- #### **步骤 1: 添加依赖** 首先,在项目中引入Elasticsearch Java客户端依赖(以Maven为例): ```xml <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.17.0</version> <!-- 根据实际版本调整 --> </dependency> ``` #### **步骤 2: 创建Elasticsearch客户端** 初始化`RestHighLevelClient`连接到Elasticsearch集群: ```java import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.apache.http.HttpHost; public class ESClient { public static RestHighLevelClient createClient() { return new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http")) ); } } ``` #### **步骤 3: 定义映射并发送请求** 使用`CreateIndexRequest`设置映射JSON,然后执行创建索引操作: ```java import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.xcontent.XContentType; public class AddMappingExample { public static void main(String[] args) { try (RestHighLevelClient client = ESClient.createClient()) { // 1. 创建索引请求 CreateIndexRequest request = new CreateIndexRequest("hotel_index"); // 索引名称 // 2. 定义映射JSON(参考引用[2]的酒店映射示例) String mappingJson = "{\n" + " \"mappings\": {\n" + " \"properties\": {\n" + " \"id\": { \"type\": \"keyword\" },\n" + " \"name\": { \"type\": \"text\", \"analyzer\": \"ik_max_word\", \"copy_to\": \"all\" },\n" + " \"address\": { \"type\": \"keyword\", \"index\": false },\n" + " \"price\": { \"type\": \"integer\" },\n" + " \"score\": { \"type\": \"integer\" },\n" + " \"brand\": { \"type\": \"keyword\", \"copy_to\": \"all\" },\n" + " \"city\": { \"type\": \"keyword\" },\n" + " \"location\": { \"type\": \"geo_point\" }\n" + " }\n" + " }\n" + "}"; // 3. 将映射添加到请求中 request.source(mappingJson, XContentType.JSON); // 4. 发送请求并检查响应 CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT); if (response.isAcknowledged()) { System.out.println("映射添加成功!索引已创建。"); } else { System.out.println("映射添加失败。"); } } catch (Exception e) { e.printStackTrace(); } } } ``` #### **关键参数说明** - **索引名称**:`"hotel_index"`可自定义。 - **映射JSON**:基于引用[2]的酒店模型,定义了字段类型(如`keyword`、`text`、`geo_point`)、分词器(`ik_max_word`用于中文分词)等[^2]。 - **`XContentType.JSON`**:指定映射格式为JSON。 - **响应处理**:`response.isAcknowledged()`返回`true`表示操作成功。 #### **注意事项** 1. **映射更新限制**:Elasticsearch不允许直接修改已有字段的映射类型。如需更新,需创建新索引并迁移数据。 2. **异常处理**:添加`try-catch`块捕获`IOException`或Elasticsearch异常(如索引已存在)。 3. **字段类型**:确保字段类型与数据匹配,例如`geo_point`用于经纬度坐标。 4. **客户端关闭**:使用`try-with-resources`确保客户端自动关闭,避免资源泄漏。 通过以上方法,您可以高效地在Java中实现Elasticsearch的映射添加功能。更多高级操作(如动态映射)可参考官方文档[^1]。 --- ### 相关问题 1. **如何在Java中更新现有索引的映射?** (讨论重建索引或使用`PutMappingRequest`的方法) 2. **Elasticsearch映射的常见字段类型有哪些?如何选择?** (对比`text`、`keyword`、`integer`等类型的使用场景) 3. **如何处理映射冲突或数据类型不匹配的错误?** (分析错误原因和解决方案)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值