连接Client
// 按集群名称创建
/**
* clusterName需要跟elasticsearch.yml里的clusterName相同
*/
Settings settings = Settings.builder().put("cluster.name", clusterName)//设置ES实例的名称
.put("client.transport.sniff", true)//增加自动嗅探配置
.build();
/**
* 1、ip在cmd中用config查看,必须为本机号。 2、启动ES的bin目录下的ES.bat文件。 3、创建客户端。
*/
searchClient = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), port));
Index API
这里我只推荐使用MAP方式和官方的XContentBuilder帮助类方式
/**
* 使用集合
*/
@Test
public void CreateList(){
Map<String, Object> json = new HashMap<String, Object>();
json.put("user","kimchy");
json.put("postDate","2013-01-30");
json.put("message","trying out Elasticsearch");
IndexResponse response = client.prepareIndex("fendo", "fendodate")
.setSource(json)
.get();
System.out.println(response.getResult());
}
/**
* 使用ElasticSearch 帮助类
* @throws IOException
*/
@Test
public void CreateXContentBuilder() throws IOException{
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.field("user", "ccse")
.field("postDate", new Date())
.field("message", "this is Elasticsearch")
.endObject();
IndexResponse response = client.prepareIndex("fendo", "fendodata").setSource(builder).get();
System.out.println("创建成功!");
}
Get API
operationThreaded
设置为 true
是在不同的线程里执行此次操作
GetResponse response = client.prepareGet("twitter", "tweet", "1")
.setOperationThreaded(false)
.get();
Delete API
根据id删除
DeleteResponse response = client.prepareDelete("twitter", "tweet", "1").get();
Delete By Query API
通过查询条件删除BulkByScrollResponse response =
DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
.filter(QueryBuilders.matchQuery("gender", "male")) //查询条件
.source("persons") //index(索引名)
.get(); //执行
long deleted = response.getDeleted(); //删除文档的数量
Update API
使用UpdateRequest
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index("index");
updateRequest.type("type");
updateRequest.id("1");
updateRequest.doc(jsonBuilder()
.startObject()
.field("gender", "male")
.endObject());
client.update(updateRequest).get();
一次获取多个文档
MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
.add("twitter", "tweet", "1") //一个id的方式
.add("twitter", "tweet", "2", "3", "4") //多个id的方式
.add("another", "type", "foo") //可以从另外一个索引获取
.get();
for (MultiGetItemResponse itemResponse : multiGetItemResponses) { //迭代返回值
GetResponse response = itemResponse.getResponse();
if (response.isExists()) { //判断是否存在
String json = response.getSourceAsString(); //_source 字段
}
}
同时执行多个搜索请求
SearchRequestBuilder srb1 = client
.prepareSearch().setQuery(QueryBuilders.queryStringQuery("elasticsearch")).setSize(1);
SearchRequestBuilder srb2 = client
.prepareSearch().setQuery(QueryBuilders.matchQuery("name", "kimchy")).setSize(1);
MultiSearchResponse sr = client.prepareMultiSearch()
.add(srb1)
.add(srb2)
.get();
// You will get all individual responses from MultiSearchResponse#getResponses()
long nbHits = 0;
for (MultiSearchResponse.Item item : sr.getResponses()) {
SearchResponse response = item.getResponse();
nbHits += response.getHits().getTotalHits();
}
聚合框架
聚合框架有助于根据搜索查询提供聚合数据。它是基于简单的构建块也称为整合,整合就是将复杂的数据摘要有序的放在一块。
聚合可以被看做是从一组文件中获取分析信息的一系列工作的统称。聚合的实现过程就是定义这个文档集的过程(例如,在搜索请求的基础上,执行查询/过滤,才能得到高水平的聚合结果)。
SearchResponse sr = client.prepareSearch()
.setQuery(QueryBuilders.matchAllQuery())
.addAggregation(
AggregationBuilders.terms("agg1").field("field")
)
.addAggregation(
AggregationBuilders.dateHistogram("agg2")
.field("birth")
.dateHistogramInterval(DateHistogramInterval.YEAR)
)
.get();
// Get your facet results
Terms agg1 = sr.getAggregations().get("agg1");
Histogram agg2 = sr.getAggregations().get("agg2");
获取文档的最大数量
SearchResponse sr = client.prepareSearch(INDEX)
.setTerminateAfter(1000) //如果达到这个数量,提前终止
.get();
if (sr.isTerminatedEarly()) {
// We finished early
}
最小值聚合使用
创建聚合请求:
MinAggregationBuilder aggregation =
AggregationBuilders
.min("agg")
.field("height");
使用:
// sr is here your SearchResponse object
Min agg = sr.getAggregations().get("agg");
double value = agg.getValue();
最大值聚合
MaxAggregationBuilder aggregation =
AggregationBuilders
.max("agg")
.field("height");
// sr is here your SearchResponse object
Max agg = sr.getAggregations().get("agg");
double value = agg.getValue();
求和聚合
SumAggregationBuilder aggregation =
AggregationBuilders
.sum("agg")
.field("height");
// sr is here your SearchResponse object
Sum agg = sr.getAggregations().get("agg");
double value = agg.getValue();
平均值聚合
AvgAggregationBuilder aggregation =
AggregationBuilders
.avg("agg")
.field("height");
// sr is here your SearchResponse object
Avg agg = sr.getAggregations().get("agg");
double value = agg.getValue();
统计聚合
统计聚合——基于文档的某个值,计算出一些统计信息(min、max、sum、count、avg), 用于计算的值可以是特定的数值型字段,也可以通过脚本计算而来。
下面是如何创建聚合请求的是示例:
StatsAggregationBuilder aggregation =
AggregationBuilders
.stats("agg")
.field("height");
使用聚合请求
import org.elasticsearch.search.aggregations.metrics.stats.Stats;
// sr is here your SearchResponse object
Stats agg = sr.getAggregations().get("agg");
double min = agg.getMin();
double max = agg.getMax();
double avg = agg.getAvg();
double sum = agg.getSum();
long count = agg.getCount();
过滤聚合
过滤聚合——基于一个条件,来对当前的文档进行过滤的聚合。
AggregationBuilders
.filter("agg", QueryBuilders.termQuery("gender", "male"));
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
// sr is here your SearchResponse object
Filter agg = sr.getAggregations().get("agg");
agg.getDocCount(); // Doc count
Match All Query
最简单的查询,它匹配所有文档QueryBuilder qb = matchAllQuery();
匹配查询
用于执行全文查询的标准查询,包括模糊匹配和词组或邻近程度的查询QueryBuilder qb = matchQuery(
"name", //field 字段
"kimchy elasticsearch" // text
);
多字段查询
可以用来对多个字段的版本进行匹配查询QueryBuilder qb = multiMatchQuery(
"kimchy elasticsearch", //text
"user", "message" //fields 多个字段
);
ID查询
查询具有指定类型和 ID 的文档
QueryBuilder qb = idsQuery("my_type", "type2")
.addIds("1", "4", "100");
QueryBuilder qb = idsQuery() // type 是可选择的,可以不写
.addIds("1", "4", "100");
前缀查询
查找指定字段包含以指定的精确前缀开头的值的文档。QueryBuilder qb = prefixQuery(
"brand", //field
"heine" //prefix
);