elasticsearch java使用
本文将介绍如何使用java调用elasticsearch的api
1、获取client连接
package com.test.elasticsearch; import java.net.InetAddress;
import java.net.UnknownHostException; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.After;
import org.junit.Before; /**
* 抽象的Junit测试
*
* @author xuwenjin
*/
public abstract class AbstractJunitTest { protected Logger logger = LogManager.getLogger(this.getClass()); protected Client client; /**
* 获取一个客户端
*/
@SuppressWarnings("resource")
@Before
public void getClient() throws UnknownHostException {
Settings settings = Settings.builder().put("cluster.name", "xwj").build(); TransportAddress transportAddress = new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), );
client = new PreBuiltTransportClient(settings).addTransportAddress(transportAddress);
} /**
* 关闭连接
*/
@After
public void close() {
client.close();
} }
2、新增、删除索引
package com.test.elasticsearch; import java.io.IOException;
import java.util.HashMap;
import java.util.Map; import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequestBuilder;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequestBuilder;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.junit.Test; /**
* 索引操作测试
*
* @author xuwenjin
*/
public class IndexTest extends AbstractJunitTest { /**
* 判断是否存在该索引
*
* @param indexName
* 索引名称
* @return
*/
public boolean isIndexExists(String indexName) {
IndicesExistsRequestBuilder builder = client.admin().indices().prepareExists(indexName);
IndicesExistsResponse res = builder.get();
return res.isExists();
} /**
* 5.*之后,把string字段设置为了过时字段,引入text,keyword字段
*
* keyword:存储数据时候,不会分词建立索引
* text:存储数据时候,会自动分词,并生成索引(这是很智能的,但在有些字段里面是没用的,所以对于有些字段使用text则浪费了空间)。
*
* 如果在添加分词器的字段上,把type设置为keyword,则创建索引会失败
*/
public XContentBuilder getIndexSource() throws IOException {
XContentBuilder source = XContentFactory.jsonBuilder().startObject().startObject("test_type2")
.startObject("properties")
// code字段
.startObject("code").field("type", "text").field("index", true).field("fielddata", true).endObject()
// 名称字段
.startObject("name").field("type", "keyword").field("store", false).field("index", true).endObject()
// 信息字段
.startObject("info").field("type", "keyword").field("store", false).field("index", true).endObject()
// 主要内容字段
.startObject("content").field("type", "text").field("store", true).field("index", true).field("analyzer", "ik_max_word").endObject()
.startObject("my_title").field("type", "keyword").field("store", true).field("index", true).endObject()
.startObject("you_title").field("type", "keyword").field("store", true).field("index", true).endObject()
.startObject("isDelete").field("type", "boolean").field("store", true).field("index", true).endObject()
.startObject("age").field("type", "long").field("store", true).field("index", true).endObject() .endObject().endObject().endObject();
return source;
} /**
* 创建索引
*/
@Test
public void createIndex() {
try {
if (isIndexExists("test_index2")) {
logger.info("索引对象已经存在,无法创建!");
return;
}
CreateIndexRequestBuilder builder = client.admin().indices().prepareCreate("test_index2");
// 直接创建Map结构的setting
Map<String, Object> settings = new HashMap<>();
settings.put("number_of_shards", ); // 分片数
settings.put("number_of_replicas", ); // 副本数
settings.put("refresh_interval", "10s"); // 刷新间隔
builder.setSettings(settings); builder.addMapping("test_type2", getIndexSource()); CreateIndexResponse res = builder.get();
logger.info(res.isAcknowledged() ? "索引创建成功!" : "索引创建失败!");
} catch (Exception e) {
logger.error("创建索引失败!", e);
}
} /**
* 删除索引
*/
@Test
public void deleteIndex() {
try {
if (!isIndexExists("test_index2")) {
logger.info("索引对象已经不存在,无法删除!");
return;
}
DeleteIndexRequestBuilder builder = client.admin().indices().prepareDelete("test_index2");
DeleteIndexResponse res = builder.get();
logger.info(res.isAcknowledged() ? "删除索引成功!" : "删除索引失败!");
} catch (Exception e) {
logger.error("删除索引失败!", e);
}
} }
执行createIndex方法之后,可以在elasticsearch-head中看到该索引被创建
3、向ES中添加数据
package com.test.elasticsearch; import java.util.HashMap;
import java.util.Map; import org.junit.Test; /**
* 向ES中添加数据
*
* @author xuwenjin
*/
public class AddDataTest extends AbstractJunitTest { // private static final String INDEX = "test_index1";
// private static final String TYPE = "test_type1";
private static final String INDEX2 = "test_index2";
private static final String TYPE2 = "test_type2"; @Test
public void saveData() {
try {
Map<String, Object> source = new HashMap<String, Object>();
source.put("code", "");
source.put("name", "科技");
source.put("info", "中共十九大");
source.put("content", "中共十九大");
source.put("my_title", "我的标题12323abcd");
source.put("you_title", "你的标题1efg");
source.put("isDelete", true);
source.put("age", ); Map<String, Object> source2 = new HashMap<String, Object>();
source2.put("code", "");
source2.put("name", "新闻");
source2.put("info", "中国周恩来");
source2.put("content", "中国周恩来");
source2.put("my_title", "我的标题235325abcd");
source2.put("you_title", "你的标题346565efg");
source2.put("isDelete", false);
source2.put("age", ); Map<String, Object> source3 = new HashMap<String, Object>();
source3.put("code", "");
source3.put("name", "科学技术");
source3.put("info", "用友建筑大武汉");
source3.put("content", "用友建筑大武汉");
source3.put("my_title", "我的标题65845abcd");
source3.put("you_title", "你的标题237678efg");
source3.put("isDelete", false);
source3.put("age", ); Map<String, Object> source4 = new HashMap<String, Object>();
source4.put("code", "");
source4.put("name", "快手视频");
source4.put("info", "中国特色社会主义");
source4.put("content", "中国特色社会主义");
source4.put("my_title", "我的标题6789dfgf");
source4.put("you_title", "你的标题67458sdfdf");
source4.put("isDelete", true);
source4.put("age", ); Map<String, Object> source5 = new HashMap<String, Object>();
source5.put("code", "");
source5.put("name", "科技视频");
source5.put("info", "最美天安门");
source5.put("content", "最美天安门");
source5.put("my_title", "132445dfgdfg");
source5.put("you_title", "32557fdgfg");
source5.put("isDelete", true);
source5.put("age", ); Map<String, Object> source6 = new HashMap<String, Object>();
source6.put("code", "");
source6.put("name", "最快的技术");
source6.put("info", "美丽大武汉");
source6.put("content", "美丽大武汉");
source6.put("my_title", "356thjmkj345");
source6.put("you_title", "4gfjgfjg4523");
source6.put("isDelete", false);
source6.put("age", ); client.prepareIndex(INDEX2, TYPE2).setId("").setSource(source).get();
client.prepareIndex(INDEX2, TYPE2).setId("").setSource(source2).get();
client.prepareIndex(INDEX2, TYPE2).setId("").setSource(source3).get();
client.prepareIndex(INDEX2, TYPE2).setId("").setSource(source4).get();
client.prepareIndex(INDEX2, TYPE2).setId("").setSource(source5).get();
client.prepareIndex(INDEX2, TYPE2).setId("").setSource(source6).get(); } catch (Exception e) {
logger.error("保存数据失败!", e);
}
} }
4、简单查询、删除数据
package com.test.elasticsearch; import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.junit.Test; /**
* 简单查询数据、删除数据
*
* @author xuwenjin
*/
public class SimpleQueryTest extends AbstractJunitTest { private static final String INDEX = "test_index1"; // 索引
private static final String TYPE = "test_type1"; // 类型 @Test
public void queryObject() {
try {
GetResponse res = client.prepareGet(INDEX, TYPE, "").get();
if (res.isExists()) {
logger.info("根据ID查询到数据,主要内容:" + res.getSource().get("content"));
} else {
logger.info("根据ID未查询到数据!");
}
} catch (Exception e) {
logger.error("根据ID查询记录失败!", e);
}
} @Test
public void queryList() {
try {
String key = "周恩来";
QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(key, "name", "content"); SearchResponse res = client.prepareSearch().setIndices(INDEX).setTypes(TYPE).setQuery(queryBuilder).get(); logger.info("查询到的总记录个数为:" + res.getHits().getTotalHits());
for (int i = ; i < res.getHits().getTotalHits(); i++) {
logger.info("第" + (i + ) + "条记录主要内容为:" + res.getHits().getAt(i).getSource().get("content"));
}
} catch (Exception e) {
logger.error("查询列表失败!", e);
}
} @Test
public void deleteData() {
try {
DeleteResponse res = client.prepareDelete(INDEX, TYPE, "").get(); logger.info("删除动作执行状态:" + res.status());
} catch (Exception e) {
logger.error("删除数据失败!", e);
}
} }
5、复杂查询
package com.test.elasticsearch; import java.util.Map; import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.junit.Test; /**
* 复杂查询,使用QueryBuilder进行bool查询
*
* @author xuwenjin
*/
public class QueryBuilderTest extends AbstractJunitTest { private static final String INDEX2 = "test_index2";
private static final String TYPE2 = "test_type2"; public String text = "科技视频"; /**
* 单个精确值查找(termQuery)
*/
@Test
public void termQuery() {
QueryBuilder queryBuilder = QueryBuilders.termQuery("code", "");
queryBuilder = QueryBuilders.termQuery("isDelete", true);
queryBuilder = QueryBuilders.termQuery("my_title", "我的标题12323abcd");
searchFunction(queryBuilder);
} /**
* 多个值精确查找(termsQuery)
*
* 一个查询相匹配的多个value
*/
@Test
public void termsQuery() {
QueryBuilder queryBuilder = QueryBuilders.termsQuery("code", "", "", "");
searchFunction(queryBuilder);
} /**
* 查询相匹配的文档在一个范围(rangeQuery)
*/
@Test
public void rangeQuery() {
QueryBuilder queryBuilder = QueryBuilders
.rangeQuery("code") // 查询code字段
.from("")
.to("")
.includeLower(true) // 包括下界
.includeUpper(false);// 不包括上界
searchFunction(queryBuilder);
} /**
* 查询相匹配的文档在一个范围(prefixQuery)
*/
@Test
public void prefixQuery() {
QueryBuilder queryBuilder = QueryBuilders.prefixQuery("my_title", "我的");
searchFunction(queryBuilder);
} /**
* 通配符检索(wildcardQuery)
*
* 值使用用通配符,常用于模糊查询
*
* 匹配具有匹配通配符表达式( (not analyzed )的字段的文档。 支持的通配符:
* *,它匹配任何字符序列(包括空字符序列)
* ?,它匹配任何单个字符。
*
* 请注意,此查询可能很慢,因为它需要遍历多个术语。 为了防止非常慢的通配符查询,通配符不能以任何一个通配符*或?开头。
*/
@Test
public void wildcardQuery() {
QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("my_title", "*6789*");
queryBuilder = QueryBuilders.wildcardQuery("my_title", "*345");
queryBuilder = QueryBuilders.wildcardQuery("name", "?闻");
searchFunction(queryBuilder);
} /**
* 正则表达式检索(regexpQuery) 不需要^、$
*/
@Test
public void regexpQuery() {
QueryBuilder queryBuilder = QueryBuilders.regexpQuery("my_title", "我的.+f");
searchFunction(queryBuilder);
} /**
* 使用模糊查询匹配文档查询(fuzzyQuery)
*/
@Test
public void fuzzyQuery() {
QueryBuilder queryBuilder = QueryBuilders.fuzzyQuery("name", "科技");
searchFunction(queryBuilder);
} /**
* 类型检索(typeQuery)
*
* 查询该类型下的所有数据
*/
@Test
public void typeQuery() {
QueryBuilder queryBuilder = QueryBuilders.typeQuery(TYPE2);
searchFunction(queryBuilder);
} /**
* Ids检索, 返回指定id的全部信息 (idsQuery)
*
* 在idsQuery(type)方法中,也可以指定具体的类型
*/
@Test
public void idsQuery() {
QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("", "", "");
searchFunction(queryBuilder);
} /************************************************************ 全文检索 ************************************************************/ /**
* 单个匹配 (matchQuery)
*
* 感觉跟termQuery效果一样
*/
@Test
public void matchQuery() {
QueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "科技");
searchFunction(queryBuilder);
} /**
* 查询匹配所有文件 (matchAllQuery)
*/
@Test
public void matchAllQuery() {
QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
searchFunction(queryBuilder);
} /**
* 匹配多个字段, field可以使用通配符(multiMatchQuery)
*/
@Test
public void multiMatchQuery() {
QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("132445dfgdfg", "my_title", "name", "you_title");
queryBuilder = QueryBuilders.multiMatchQuery("132445dfgdfg", "*title"); //字段使用通配符
searchFunction(queryBuilder);
} /**
* 字符串检索(queryString)
*
* 一个使用查询解析器解析其内容的查询。
* query_string查询提供了以简明的简写语法执行多匹配查询 multi_match queries ,布尔查询 bool queries ,提升得分 boosting ,模糊
* 匹配 fuzzy matching ,通配符 wildcards ,正则表达式 regexp 和范围查询 range queries 的方式。
*
* 支持参数达10几种
*/
@Test
public void queryString() {
QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("*技术"); //通配符查询
// QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("我的.+f");
searchFunction(queryBuilder);
} /**
* must 相当于and,就是都满足
* should 相当于or,满足一个或多个
* must_not 都不满足
*/
@Test
public void testQueryBuilder2() {
// "科技视频"分词的结果是"科技", "视频", "频"
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
// queryBuilder.must(QueryBuilders.wildcardQuery("name", "*科技*"));
// queryBuilder.must(QueryBuilders.wildcardQuery("info", "*共*"));
// queryBuilder.must(QueryBuilders.wildcardQuery("content", "*美丽*")); queryBuilder.should(QueryBuilders.wildcardQuery("name", "*科技*"));
queryBuilder.should(QueryBuilders.wildcardQuery("info", "*共*"));
queryBuilder.should(QueryBuilders.wildcardQuery("content", "*美丽*"));
queryBuilder.minimumShouldMatch(); // 最少匹配数 // queryBuilder.mustNot(QueryBuilders.wildcardQuery("name", "*科技*"));
// queryBuilder.mustNot(QueryBuilders.wildcardQuery("info", "*共*"));
// queryBuilder.mustNot(QueryBuilders.wildcardQuery("content", "*美丽*"));
searchFunction(queryBuilder);
} /**
* 查询遍历抽取
*
* 查询结果是根据分值排序(从大到小)
*
* @param queryBuilder
*/
private void searchFunction(QueryBuilder queryBuilder) {
SearchRequestBuilder requestBuilder = client.prepareSearch().setIndices(INDEX2).setTypes(TYPE2)
.setScroll(new TimeValue()).setQuery(queryBuilder);
SearchResponse response = requestBuilder.setFrom().setSize().execute().actionGet();
System.out.println("--------------查询结果:----------------------");
for (SearchHit hit : response.getHits()) {
System.out.println("分值:" + hit.getScore()); // 相关度
Map<String, Object> map = hit.getSource();
for (String sKey : map.keySet()) {
System.out.println(sKey + ": " + map.get(sKey));
}
System.out.println("--------------");
}
System.out.println("-----------------------------------");
} }
本文的源码地址:https://github.com/xuwenjin/xwj_repo/tree/master/elasticsearch
参考资料:
解析Elasticsearch的SearchRequestBuilder的query类型
Elasticsearch检索分类深入详解—基础篇
elasticsearch java使用的更多相关文章
- [搜索]ElasticSearch Java Api(一) -添加数据创建索引
转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...
- Elasticsearch java api 基本搜索部分详解
文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...
- Elasticsearch java api 常用查询方法QueryBuilder构造举例
转载:http://m.blog.csdn.net/u012546526/article/details/74184769 Elasticsearch java api 常用查询方法QueryBuil ...
- Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
目录 引言 Search APIs Search API Search Request 可选参数 使用 SearchSourceBuilder 构建查询条件 指定排序 高亮请求 聚合请求 建议请求 R ...
- Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
目录 上篇回顾 Building Queries 匹配所有的查询 全文查询 Full Text Queries 什么是全文查询? Match 全文查询 API 列表 基于词项的查询 Term Term ...
- Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)
elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介.Java REST Client.Java Client.Spri ...
- State of the official Elasticsearch Java clients
Elasticsearch Java Clients | Elastic https://www.elastic.co/blog/state-of-the-official-elasticsearch ...
- 第08章 ElasticSearch Java API
本章内容 使用客户端对象(client object)连接到本地或远程ElasticSearch集群. 逐条或批量索引文档. 更新文档内容. 使用各种ElasticSearch支持的查询方式. 处理E ...
- ElasticSearch Java Api-删除索引
删除可以是删除整个索引库,也可以根据文档id删除索引库下的文档,还可以通过query查询条件删除所有符合条件的数据. 一.删除整个索引库 下面的例子会删除indexName索引: DeleteInde ...
- Elasticsearch Java API深入详解
0.题记 之前Elasticsearch的应用比较多,但大多集中在关系型.非关系型数据库与Elasticsearch之间的同步.以上内容完成了Elasticsearch所需要的基础数据量的供给.但想要 ...
随机推荐
- BitAdminCore框架应用篇:(二)创建一个简单的增删改查模块
NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/cookie ...
- git生成Key操作保存到GITHUB中
https://blog.csdn.net/sinat_23880167/article/details/78502528 1. 在git中通过命令: $ ssh-keygen Generating ...
- AndroidStudio的一些快捷键的使用
1.返回上一次浏览快捷键的设置 https://blog.csdn.net/yingtian648/article/details/73277388 2.格式化代码的快捷键的设置 htt ...
- Delphi - 让Delphi10.2在Windows下开发的图形界面程序运行在64位Linux中!
FmxLinux官网:https://fmxlinux.com/ 参考: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Linux_Applica ...
- jzoj5804
這道題n-m很小,可以從此入手 記f[i][j]為i個字符括號綜合為j的合法方案數 則第i個括號可以枚舉為(和),所以f[i][j]=f[i-1][j-1]+f[i-1][j+1],小心越界 再記a為 ...
- sql语句应考虑哪些安全性?
(1)少使用root账户,应该为不同的动作分配不同的账户: (2)sql执行出错后,不能把数据库中显示的出错信息,直接展示给用户.防止泄露服务器和数据库相关信息: (3)防止sql注入,对特殊字符进行 ...
- sql语句_2
数据表如下 一个user_id对应多个user_name,现在要求是:如果某个用户对应的user_name中存在一个a,打印user_id,a出来:如果不存在,打印user_id,0.打印时候user ...
- CF 798B 渣渣题
题目链接:http://codeforces.com/contest/798/problem/B 此题是我打河工大校赛前一晚熬夜打CF时硬肛过去的B题,今天补题时,偶然看到dalao的代码,ORZ,s ...
- [Virus Analysis]恶意软件分析(二)玩出花的批处理(中)
本文作者:i春秋作家——Sp4ce 0×01上一篇文章部分 首先是文件目录 整理后的目录 整理前的部分文件代码 update.bat %%Q %%Q %%Q %%Q %%Q %%Q %%Q %%Q % ...
- 关于rpm的命令
我是从这里学的:https://www.cnblogs.com/picaso/archive/2012/07/02/2573748.html 软件的安装时操作系统管理的基础,与Windows不同,Li ...