首先添加核心POM包
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>2.4.5</version>
</dependency>
几种查询类型,多数情况下用分页和高亮
package com.ego;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Map;
public class ElasticsearchTest {
private static Logger logger = LoggerFactory.getLogger(ElasticsearchTest.class);
// 服务器地址
public static final String HOST = "127.0.0.1";
// 服务器端口
public static final int PORT = 9300;
// 集群名称
public static final String CLUSTER_NAME = "es";
// 客户端
private TransportClient client = null;
// 设置属性
private static Settings settings = Settings.builder()
// 设置集群名称
.put("cluster.name", CLUSTER_NAME)
// 开启嗅探模式自动嗅探整个集群的状态,es会自动把集群中其它机器的ip地址加到客户端中
.put("client.transport.sniff", true)
.build();
/**
* 获取客户端连接信息
*/
@Before
public void getConnect() {
try {
/*
// 也可以通过map来配置属性
Map<String, String> map = new HashMap<>();
map.put("cluster.name", CLUSTER_NAME);
private static Settings settings = Settings.builder().put(map);
*/
client = TransportClient.builder().settings(settings).build()
.addTransportAddresses(new InetSocketTransportAddress(InetAddress.getByName(HOST), PORT));
logger.info("连接信息:" + client.toString());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
/**
* 查询单条
*/
@Test
public void testQuery01() {
//查询索引库、类型、主键
GetResponse response = client.prepareGet("Aaron", "goods", "1")
.execute().actionGet();
System.out.println(response.getSource());
}
/**
* 匹配查询
*/
@Test
public void testQuery02() {
// 指定查询的索引库和类型
SearchRequestBuilder builder = client.prepareSearch("Aaron", "ik")
.setTypes("goods", "ikType");
// 设置查询的关键词
String key = "中国";
// 指定查询的列
builder.setQuery(QueryBuilders.multiMatchQuery(key, "goodsName", "content"));
// 开始查询
SearchResponse response = builder.get();
// 获取命中数据
SearchHits searchHits = response.getHits();
// 获取命中数据总条数
System.out.println("查询结果总条数:" + searchHits.getTotalHits());
for (SearchHit hit : searchHits) {
System.out.println("索引库:" + hit.getIndex());
System.out.println("类型:" + hit.getType());
System.out.println("主键:" + hit.getId());
System.out.println("分数:" + hit.getScore());
// 获取原数据
Map<String, Object> sourceMap = hit.getSource();
for (Map.Entry<String, Object> source : sourceMap.entrySet()) {
System.out.println(source.getKey() + "---" + source.getValue());
}
// JSON
System.out.println(hit.getSourceAsString());
System.out.println("---------------分割线---------------");
}
}
/**
* 查询所有
*/
@Test
public void testQuery03() {
// 指定查询的索引库和类型
SearchRequestBuilder builder = client.prepareSearch("Aaron", "ik")
.setTypes("goods", "ikType");
// 查询所有数据
builder.setQuery(QueryBuilders.matchAllQuery());
// 开始查询
SearchResponse response = builder.get();
// 获取命中数据
SearchHits searchHits = response.getHits();
// 获取命中数据总条数
System.out.println("查询结果总条数:" + searchHits.getTotalHits());
for (SearchHit hit : searchHits) {
System.out.println("索引库:" + hit.getIndex());
System.out.println("类型:" + hit.getType());
System.out.println("主键:" + hit.getId());
System.out.println("分数:" + hit.getScore());
// 获取原数据
Map<String, Object> sourceMap = hit.getSource();
for (Map.Entry<String, Object> source : sourceMap.entrySet()) {
System.out.println(source.getKey() + "---" + source.getValue());
}
// JSON
System.out.println(hit.getSourceAsString());
System.out.println("---------------分割线---------------");
}
}
/**
* 分页查询
*/
@Test
public void testQuery04() {
testQueryPage(2, 5);
}
private void testQueryPage(Integer pageNum, Integer pageSize) {
// 指定查询的索引库和类型
SearchRequestBuilder builder = client.prepareSearch("Aaron").setTypes("goods");
// 设置分页
builder.setFrom((pageNum - 1) * pageSize).setSize(pageSize);
// 设置查询的关键词
String key = "中国移动联通电信";
// 指定查询的列
builder.setQuery(QueryBuilders.multiMatchQuery(key, "goodsName"));
// 开始查询
SearchResponse response = builder.get();
// 获取命中数据
SearchHits searchHits = response.getHits();
// 获取命中数据总条数
System.out.println("查询结果总条数:" + searchHits.getTotalHits());
for (SearchHit hit : searchHits) {
System.out.println("索引库:" + hit.getIndex());
System.out.println("类型:" + hit.getType());
System.out.println("主键:" + hit.getId());
System.out.println("分数:" + hit.getScore());
// 获取原数据
Map<String, Object> sourceMap = hit.getSource();
for (Map.Entry<String, Object> source : sourceMap.entrySet()) {
System.out.println(source.getKey() + "---" + source.getValue());
}
// JSON
System.out.println(hit.getSourceAsString());
System.out.println("---------------分割线---------------");
}
}
/**
* 高亮查询
*/
@Test
public void testQuery05() {
// 指定查询的索引库和类型
SearchRequestBuilder builder = client.prepareSearch("Aaron").setTypes("goods");
// 设置分页
builder.setFrom(0).setSize(5);
// 设置高亮前缀
builder.setHighlighterPreTags("<span style='color:red;'>");
// 设置高亮后缀
builder.setHighlighterPostTags("</span>");
// 设置高亮字段名称
builder.addHighlightedField("goodsName");
// 设置查询的关键词
String key = "中国移动联通电信";
// 指定查询的列
builder.setQuery(QueryBuilders.multiMatchQuery(key, "goodsName"));
// 开始查询
SearchResponse response = builder.get();
// 获取命中数据
SearchHits searchHits = response.getHits();
// 获取命中数据总条数
System.out.println("查询结果总条数:" + searchHits.getTotalHits());
for (SearchHit hit : searchHits) {
/*
System.out.println("索引库:" + hit.getIndex());
System.out.println("类型:" + hit.getType());
System.out.println("主键:" + hit.getId());
System.out.println("分数:" + hit.getScore());
// 获取原数据
Map<String, Object> sourceMap = hit.getSource();
for (Map.Entry<String, Object> source : sourceMap.entrySet()) {
System.out.println(source.getKey() + "---" + source.getValue());
}
// JSON
System.out.println(hit.getSourceAsString());
// 高亮信息
String highlightMessage = hit.getHighlightFields().get("goodsName").getFragments()[0].toString();
*/
// 根据项目所需构建返回结果集
String highlightMessage = String.valueOf(hit.getHighlightFields().get("goodsName").fragments()[0]);
Integer goodsId = (Integer) hit.getSource().get("goodsId");
String goodsName = String.valueOf(hit.getSource().get("goodsName"));
String originalImg = String.valueOf(hit.getSource().get("originalImg"));
BigDecimal marketPrice = new BigDecimal(String.valueOf(hit.getSource().get("marketPrice")));
System.out.println("goodsId: " + goodsId);
System.out.println("goodsName: " + goodsName);
System.out.println("goodsNameHl: " + highlightMessage);
System.out.println("marketPrice: " + marketPrice);
System.out.println("originalImg: " + originalImg);
System.out.println("---------------分割线---------------");
}
}
/**
* 关闭连接
*/
@After
public void closeConnect() {
if (null != client)
client.close();
}
}