本文将介绍如何使用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检索分类深入详解—基础篇

  SearchRequestBuilder常用方法说明

  

elasticsearch java使用的更多相关文章

  1. [搜索]ElasticSearch Java Api(一) -添加数据创建索引

    转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...

  2. Elasticsearch java api 基本搜索部分详解

    文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...

  3. Elasticsearch java api 常用查询方法QueryBuilder构造举例

    转载:http://m.blog.csdn.net/u012546526/article/details/74184769 Elasticsearch java api 常用查询方法QueryBuil ...

  4. Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI

    目录 引言 Search APIs Search API Search Request 可选参数 使用 SearchSourceBuilder 构建查询条件 指定排序 高亮请求 聚合请求 建议请求 R ...

  5. Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries

    目录 上篇回顾 Building Queries 匹配所有的查询 全文查询 Full Text Queries 什么是全文查询? Match 全文查询 API 列表 基于词项的查询 Term Term ...

  6. 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 ...

  7. State of the official Elasticsearch Java clients

    Elasticsearch Java Clients | Elastic https://www.elastic.co/blog/state-of-the-official-elasticsearch ...

  8. 第08章 ElasticSearch Java API

    本章内容 使用客户端对象(client object)连接到本地或远程ElasticSearch集群. 逐条或批量索引文档. 更新文档内容. 使用各种ElasticSearch支持的查询方式. 处理E ...

  9. ElasticSearch Java Api-删除索引

    删除可以是删除整个索引库,也可以根据文档id删除索引库下的文档,还可以通过query查询条件删除所有符合条件的数据. 一.删除整个索引库 下面的例子会删除indexName索引: DeleteInde ...

  10. Elasticsearch Java API深入详解

    0.题记 之前Elasticsearch的应用比较多,但大多集中在关系型.非关系型数据库与Elasticsearch之间的同步.以上内容完成了Elasticsearch所需要的基础数据量的供给.但想要 ...

随机推荐

  1. Enum 绑定到 CheckBox

    第一种方法: 后台: internal static class EnumCache<T> where T : struct, IConvertible { private static ...

  2. c# 输入姓名直到输入的是quit时,停止输入然后显示出输入的姓名个数及姓名

    1.输入姓名直到输入的是quit时(不区分大小写),停止输入然后显示出输入的姓名个数及姓名: 要求结果如下图所示: class Program { static void Main(string[] ...

  3. Spring Boot 学习系列(10)—SpringBoot+JSP的使

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 解决问题 随着spring boot 框架的逐步使用,我们期望对于一些已有的系统进行改造,做成通用的脚手架, ...

  4. window10下Docker安装

    首先window版本必须是10,如果是win7那么安装方法有所不同,win10是官方支持安装的.笔者安装的是Community社区版,版本信息如下: 1.去docker官网下载win10安装包: ht ...

  5. docker 搭建Mysql集群

    docker基本指令: 更新软件包 yum -y update 安装Docker虚拟机(centos 7) yum install -y docker 运行.重启.关闭Docker虚拟机 servic ...

  6. hdu4462--曼哈顿距离

    题目大意:有N*N个点的田野,然后有k个点是用来放稻草人的,每个稻草人对周围满足曼哈顿距离的庄稼有保护作用 问最小的稻草人的个数能够保护所有庄稼,如果不能保护则输出-1 注意的地方: 1.放稻草人的点 ...

  7. 使用SUI框架下的<a>标签点击跳转页面不刷新的问题

    最近写好了几个页面,今天试着将各个页面的链接打通,然后问题就来了...(╯︵╰) 这里看一下原来想要实现的两个页面跳转的效果--点击图一标注的栏目可以跳转到一个新的页面图二... 按照之前写a标签的跳 ...

  8. FlowPortal-BPM——功能:判断数据库表中字段是否重复并阻止提交或保存

    一.JS添加代码,判断是否有OnSubmit事件 文件位置:YZSoft/Forms/src/Validator.js //=====判断是否有OnSubmit事件===== if (typeof ( ...

  9. 添加新内容的四个 jQuery 方法:append,prepend,after,before

    添加新内容的四个 jQuery 方法区别如下: append() - 在被选元素(里面)的结尾插入内容prepend() - 在被选元素(里面)的开头插入内容 //jQuery append() 方法 ...

  10. 关于editplus设置java和c#

    1.java设置 首先要在目录上手动新建一个class文件.放置编译好的class文件