2018-04-10

/**

*該篇文章主要介紹如何學(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ǔ)充。

*/

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容