/**
*該篇文章主要介紹如何學(xué)習(xí)ES,如何入門,ES簡(jiǎn)單的檢索方式等(ES版本2.4.1)
**/
public class Elasticsearch {
//elasticsearch為一個(gè)開源的非關(guān)系型數(shù)據(jù)庫(kù),主要用于大數(shù)據(jù)的檢索,目前對(duì)于聚合分析也在慢慢優(yōu)化。
//如何使用elasticsearch呢,首先我們要定義一個(gè)基本的存儲(chǔ)結(jié)構(gòu)
/**
* 如我們構(gòu)建一個(gè)學(xué)生的索引,學(xué)生的屬性有姓名、性別、年齡
*
*
*{
"settings": {
"number_of_shards" : 1,
"number_of_replicas" : 0
},
"mappings":{
"students":{
"properties":{
"name":{
"type":"string"
},
"age":{
"type":"long"
},
"sex":{
"type":"string"
}
}
}
}
}
*/
/**
* 通過put指令構(gòu)建新的索引
* PUT students
* {
*? 數(shù)據(jù)結(jié)構(gòu)
* }
*
* 然后通過put指令插入數(shù)據(jù)
*
* PUT students/student(type)/1(id)
* {
*? "name":"李明",
*? "age":"16",
*? "sex":"boy"
* }
*/
/**
*這是索引已經(jīng)構(gòu)建成功了
*ES提供了兩種方式去查詢,一種通過restfulApi,一種是java API方式查詢
*/
/**
* restfulAPI是ES提供的一套DSL查詢方式
* 如:我們要查詢姓名為李明的人
* POST? students/_search
{
"query":{
"term":{
"name":{
"value":"李明"
}
}
}
}
ES提供了多種查詢邏輯如: term(完全匹配)、match(包含)、exist(存在)、range(范圍查詢)、fuzzy(模糊匹配)、prefix(前綴匹配)等、
通過不同的檢索邏查找所需內(nèi)容
*/
/**
* 如果我們同時(shí)通過多個(gè)條件查詢
* ES提供了條件與條件之間的邏輯關(guān)系Must(與)、should(或)、mustNot(非)
* ES通過bool的形式將多個(gè)條件的邏輯關(guān)系表示出來(lái)
* 如:我們要查找姓名為李明,年齡為16歲的人。
* POST students/_search
* {
"query":{
"bool":{
"must":[
{
"term":{
"name":{
"value":"李明"
}
}
},
{
"term":{
"age":{
"value":16
}
}
}
]
}
}
}
*/
/**
* javaAPI方式查詢
*/
? @Test
? public? void test(){
QueryBuilder builder = QueryBuilders.termQuery("name","李明").boost(1L);
System.out.println(builder.toString());
}
/**
* 如果多條件查詢
*/
? @Test
? public void test2(){
BoolQueryBuilder boolQueryBuilder =new BoolQueryBuilder();
QueryBuilder b1 = QueryBuilders.termQuery("name","李明");
QueryBuilder b2 = QueryBuilders.termQuery("age",16);
boolQueryBuilder.must(b1).must(b2);
QueryBuilder builder = boolQueryBuilder;
System.out.println(builder.toString());
}
/**
* 如何通過java構(gòu)建ES客戶端
*/
? public void test3(){
Client client;//ES客戶端Client
? ? String[] ips = {"192.168.0.201","192.168.0.158"};//集群節(jié)點(diǎn)信息
? ? int port =9300;//端口號(hào)
? ? Settings setting = Settings
.settingsBuilder()
//設(shè)置client.transport.sniff為true來(lái)使客戶端去嗅探整個(gè)集群的狀態(tài),把集群中其它機(jī)器的ip地址加到客戶端中,這樣做的好處是一般你不用手動(dòng)設(shè)置集群里所有集群的ip到連接客戶端,它會(huì)自動(dòng)幫你添加,并且自動(dòng)發(fā)現(xiàn)新加入集群的機(jī)器;
? ? ? ? .put("client.transport.sniff",true)
.put("cluster.name","fd-data")//集群名稱
? ? ? ? .build();
try {
List addressList =new ArrayList();
for(String ip:ips){
addressList.add(new InetSocketTransportAddress(InetAddress.getByName(ip), port));
}
client = TransportClient.builder().settings(setting).build()
.addTransportAddresses(addressList
.toArray(new InetSocketTransportAddress[addressList.size()]));
}catch (UnknownHostException e) {
e.printStackTrace();
}
//最后創(chuàng)建一個(gè)client,構(gòu)建客戶端成功。
? }
/**
* 如何通過client進(jìn)行查詢
*/
? public void test5(Client client,QueryBuilder builder){
SearchRequestBuilder searchRequestBuilderq =new SearchRequestBuilder(client, SearchAction.INSTANCE)
.setQuery((builder))
.setSearchType(SearchType.QUERY_AND_FETCH)//檢索模式,通過每個(gè)分片單獨(dú)查詢,將每個(gè)分片上返回的結(jié)果的必定比例推送出來(lái),速度最快
? ? ? ? .setIndices("es_fdlawcase")
//? ? ? ? ? ? ? ? //? ? ? ? ? ? ? ? .setRequestCache(true)
//? ? ? ? ? ? ? ? //? ? ? ? ? ? ? ? .setFetchSource(includeFields,excludeFields)
//? ? ? ? ? ? ? ? /*從第幾條結(jié)果開始返回,默認(rèn)為0*/
? ? ? ? .setFrom(0)
//? ? ? ? ? ? ? ? /*返回結(jié)果的總數(shù)量,默認(rèn)為10*/
? ? ? ? .setSize(5);
searchRequestBuilderq.execute().actionGet();
SearchResponse response1 = searchRequestBuilderq.get();
SearchHits hits = response1.getHits();
System.out.println(hits.getTotalHits());
}
/**
* ES還提供了一系列的聚合方法
* 例如:我想知道所有年齡學(xué)生構(gòu)成有哪些
* ES的聚合根據(jù)官方說(shuō)明就是每個(gè)需要聚合的條件為一個(gè)桶,先創(chuàng)建一個(gè)大桶,然后將每個(gè)聚合小桶放入大桶中。其結(jié)構(gòu)大概就是這樣模式的。
*/
? public void test6(Client client){
AggregationBuilder agg1 = AggregationBuilders.filters("agg").filter("filter",QueryBuilders.termQuery("xx","xx"));//此塊為根據(jù)用戶的過濾條件
? ? AggregationBuilder agg2 = AggregationBuilders.terms("年齡").field("age").order(Terms.Order.term(false));//對(duì)年齡進(jìn)行
? ? agg1.subAggregation(agg2);
SearchRequestBuilder searchRequestBuilder = client.prepareSearch("es_fdlawcase")
.addAggregation(agg1)
.setSize(0);
SearchResponse response = searchRequestBuilder
.execute().actionGet();
Filters aggs = response.getAggregations().get("agg");
for(Filters.Bucket bucket : aggs.getBuckets()){
Terms terms = bucket.getAggregations().get("年齡");
for(Terms.Bucket bucket1 : terms.getBuckets()){
String name = bucket1.getKeyAsString();
System.out.println(name);
}
}
}
/**
* 此為ES的基礎(chǔ)使用方式,未在檢索原理,集群搭建,以及檢索優(yōu)化上有介紹,后期會(huì)繼續(xù)補(bǔ)充。
*/
}