一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|

服務器之家 - 編程語言 - JAVA教程 - 詳解spring中使用Elasticsearch的代碼實現

詳解spring中使用Elasticsearch的代碼實現

2020-10-28 15:03周游列國之仕子 JAVA教程

本篇文章主要介紹了詳解spring中使用Elasticsearch的代碼實現,具有一定的參考價值,有興趣的可以了解一下

在使用Elasticsearch之前,先給大家聊一點干貨。

1.      ES和solr都是作為全文搜索引擎出現的。都是基于Lucene的搜索服務器。

2.   ES不是可靠的存儲系統,不是數據庫,它有丟數據的風險。

3.  ES不是實時系統,數據寫入成功只是trans log成功(類似于MySQL的bin log),寫入成功后立刻查詢查不到是正常的。因為數據此刻可能還在內存里而不是進入存儲引擎里。同理,刪除一條數據后也不是馬上消失。寫入何時可查詢?ES內部有一個后臺線程,定時將內存中的一批數據寫入到存儲引擎,此后數據可見。默認后臺線程一秒運行一次。該線程運行的越頻繁,寫入性能越低。運行的頻率越低,寫入的性能越高(不會無限高)。

4.    目前已知的單ES集群可以存儲PB級別的數據,不過這個就非常費勁了。TB級別數據沒壓力。

5.    如果使用ES官方提供的jar包訪問,需要JDK1.7及以上。

6.    使用對應的版本訪問ES server。如果ES server端的版本是1.7,那么請使用ES 1.7的client。如果ES server是2.1,請使用2.1的client。

7.     ES索引存在Linux服務器的文件系統之上(背后是文件系統,不是類似于HDFS的分布式文件系統)

8.     ES Java client是線程安全的,全局構建一個即可滿足讀寫需求,不要每次都創建ES client。每次訪問ES都構建新的es client即會拋出次異常。

9.    非常不建議使用ES的動態識別和創建的機制,因為很多情況下這并非你所需要。推薦的做法是在寫數據之前仔細的創建mapping。

10.   強烈不建議在ES中使用深分頁。可能會導致集群不可用。

11.    ES是靜態分片,一旦分片數在創建索引時確定那么后繼不能修改。

12.    ES里提供了type,很多人以為type是物理表,一個type的數據是獨立存儲的;但是在ES內部并不是這樣,type在ES內部僅僅是一個字段。所以在很多數據能分為獨立index的情況下,不要放到一個index里用type去分。只有嵌套類和父子類的情況下使用type才是合理的。

13.    ES并不提供原生的中文分詞的能力。有第三方的中文分詞的插件,比如ik等。Ik是個toy分詞器,有嚴肅的分詞需求的話,請在使用ES之前使用獨立的分詞器分好詞后向ES寫入。

14.    ES中的index,首先會進行分片,每一個分片數據一般都會有自己的副本數據,ES分配分片的策略會保證同一個分片數據和自己的副本不會分配到同一個節點上。當集群中的某一節點宕機后,ES的master在ping該節點時通過一定的策略會發現該節點不存活;會開啟ES的恢復過程

15.    ES沒有update的能力。所有的update都是標記刪除老文檔,然后重新insert一條新文檔。

好了,回歸正題。

首先:

增加我們的spring配置

?
1
2
3
4
5
6
<bean id="client" factory-bean="esClientBuilder" factory-method="init" destroy-method="close"/>
 
  <bean id="esClientBuilder" class="com.***.EsClientBuilder">
    <property name="clusterName" value="集群名稱" />
    <property name="nodeIpInfo" value="集群地址" />
  </bean>

其次:

編寫我們的EsClientBuilder類初始化我們的ES參數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package ***;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
public class EsClientBuilder {
 
 
  private String clusterName;
  private String nodeIpInfo;
  private TransportClient client;
 
  public Client init(){
    //設置集群的名字
    Settings settings = Settings.settingsBuilder()
        .put("client.transport.sniff", false)
        .put("cluster.name", clusterName)
        .build();
    //創建集群client并添加集群節點地址
    client = TransportClient.builder().settings(settings).build();
    Map<String, Integer> nodeMap = parseNodeIpInfo();
    for (Map.Entry<String,Integer> entry : nodeMap.entrySet()){
      try {
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(entry.getKey()), entry.getValue()));
      } catch (UnknownHostException e) {
        e.printStackTrace();
      }
    }
 
    return client;
  }
 
  /**
   * 解析節點IP信息,多個節點用逗號隔開,IP和端口用冒號隔開
   *
   * @return
   */
  private Map<String, Integer> parseNodeIpInfo(){
    String[] nodeIpInfoArr = nodeIpInfo.split(",");
    Map<String, Integer> map = new HashMap<String, Integer>(nodeIpInfoArr.length);
    for (String ipInfo : nodeIpInfoArr){
      String[] ipInfoArr = ipInfo.split(":");
      map.put(ipInfoArr[0], Integer.parseInt(ipInfoArr[1]));
    }
    return map;
  }
 
  public String getClusterName() {
    return clusterName;
  }
 
  public void setClusterName(String clusterName) {
    this.clusterName = clusterName;
  }
 
  public String getNodeIpInfo() {
    return nodeIpInfo;
  }
 
  public void setNodeIpInfo(String nodeIpInfo) {
    this.nodeIpInfo = nodeIpInfo;
  }
}

最后:

下面我們就可以寫自己的service類了,此類就可以通過es的原生api來操作我們的es(這里我們展示的2.X版本的)
indexName相當于數據庫名,typeName相當于表名

請參考EsServiceImpl.Java文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
package ***;
 
@Service("esService")
public class EsServiceImpl{
 
  @Autowired
  private Client client;
 
  /**
   * 用docId獲取document
   * @param indexName
   * @param typeName
   * @param docId
   */
  private static void getWithId(String indexName, String typeName, String docId) {
    //get with id
    GetResponse gResponse = client.prepareGet(indexName, typeName, docId).execute().actionGet();
    System.out.println(gResponse.getIndex());
    System.out.println(gResponse.getType());
    System.out.println(gResponse.getVersion());
    System.out.println(gResponse.isExists());
    Map<String, Object> results = gResponse.getSource();
    if(results != null) {
      for(String key : results.keySet()) {
        Object field = results.get(key);
        System.out.println(key);
        System.out.println(field);
      }
    }
  }
  private static void indexWithBulk(String index, String type) {
        //指定索引名稱,type名稱和documentId(documentId可選,不設置則系統自動生成)創建document
        IndexRequest ir1 = new IndexRequest();
        String source1 = "{" + "\"user\":\"kimchy\"," + "\"price\":\"6.3\"," + "\"tid\":\"20001\"," + "\"message\":\"Elasticsearch\"" + "}";
        ir1.index(index).type(type).id("100").source(source1);
        IndexRequest ir2 = new IndexRequest();
        String source2 = "{" + "\"user\":\"kimchy2\"," + "\"price\":\"7.3\"," + "\"tid\":\"20002\"," + "\"message\":\"Elasticsearch\"" + "}";
        ir2.index(index).type(type).id("102").source(source2);
        IndexRequest ir3 = new IndexRequest();
        String source3 = "{" + "\"user\":\"kimchy3\"," + "\"price\":\"8.3\"," + "\"tid\":\"20003\"," + "\"message\":\"Elasticsearch\"" + "}";
        ir3.index(index).type(type).id("103").source(source3);
        BulkResponse response = client.prepareBulk().add(ir1).add(ir2).add(ir3).execute().actionGet();
        BulkItemResponse[] responses = response.getItems();
        if(responses != null && responses.length > 0) {
          for(BulkItemResponse r : responses) {
            String i = r.getIndex();
            String t = r.getType();
            System.out.println(i+","+t);
          }
        }
     
  }
  private static void sumCountSearch(String indexName, String typeName,
    String sumField, String countField, String searchField, String searchValue) {
    SumBuilder sb = AggregationBuilders.sum("sumPrice").field(sumField);
    TermQueryBuilder tb = QueryBuilders.termQuery(searchField, searchValue);
    SearchResponse sResponse = client.prepareSearch(indexName).setTypes(typeName).setQuery(tb).addAggregation(sb).execute().actionGet();
    Map<String, Aggregation> aggMap = sResponse.getAggregations().asMap();
    if(aggMap != null && aggMap.size() > 0) {
      for(String key : aggMap.keySet()) {
        if("sumPrice".equals(key)) {
          Sum s = (Sum)aggMap.get(key);
          System.out.println(key + "," + s.getValue());  
        }
        else if("countTid".equals(key)) {
          StatsBuilder c = (StatsBuilder)aggMap.get(key);
          System.out.println(key + "," + c.toString());
        }
      }
    }
  }
  private static void updateDoc(String indexName, String typeName, String id) throws IOException, InterruptedException, ExecutionException {
    UpdateRequest updateRequest = new UpdateRequest();
    updateRequest.index(indexName);
    updateRequest.type(typeName);
    updateRequest.id(id);
    updateRequest.doc(jsonBuilder().startObject().field("gender", "male").endObject());
    UpdateResponse resp = client.update(updateRequest).get();
    resp.getClass();
  }
  private static void scrollSearch(String indexName, String typeName, String... ids) {
    IdsQueryBuilder qb = QueryBuilders.idsQuery().addIds(ids);
    SearchResponse sResponse = client.prepareSearch(indexName)
        .setTypes(typeName)
        .setSearchType(SearchType.SCAN)
        .setQuery(qb)
        .setScroll(new TimeValue(100))
        .setSize(50)
        .execute()
        .actionGet();
    int tShards = sResponse.getTotalShards();
    long timeCost = sResponse.getTookInMillis();
    int sShards = sResponse.getSuccessfulShards();
    System.out.println(tShards+","+timeCost+","+sShards);
     
    while (true) {
      SearchHits hits = sResponse.getHits();
      SearchHit[] hitArray = hits.getHits();
      for(int i = 0; i < hitArray.length; i++) {
        SearchHit hit = hitArray[i];
        Map<String, Object> fields = hit.getSource();
        for(String key : fields.keySet()) {
          System.out.println(key);
          System.out.println(fields.get(key));
        }
      }
      sResponse = client.prepareSearchScroll(sResponse.getScrollId()).setScroll(new TimeValue(100)).execute().actionGet();
      if (sResponse.getHits().getHits().length == 0) {
        break;
      }
    }
  }
  private static void deleteDocuments(String string, String string2) {
    SearchResponse sResponse = client.prepareSearch(string)
        .setTypes(string2)
        .setSearchType(SearchType.QUERY_THEN_FETCH)
        .setQuery(QueryBuilders.matchAllQuery())
        .setFrom(0).setSize(60)
        .execute()
        .actionGet();
    SearchHits hits = sResponse.getHits();
    long count = hits.getTotalHits();
    SearchHit[] hitArray = hits.getHits();
    List<String> ids = new ArrayList<String>(hitArray.length);
    for(int i = 0; i < count; i++) {
      System.out.println("==================================");
      SearchHit hit = hitArray[i];
      ids.add(hit.getId());
       
    }
    for(String id : ids) {
      DeleteResponse response = client.prepareDelete(string, string2, id).execute().actionGet();
    }  
  }
  private static void dateRangeSearch(String indexName, String typeName,
      String termName, String from, String to) {
    // 構建range query
    //2015-08-20 12:27:11
        QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(from).to(to);
        SearchResponse sResponse = client.prepareSearch(indexName)
            .setTypes(typeName)
            // 設置search type
            // 常用search type用:query_then_fetch
            // query_then_fetch是先查到相關結構,然后聚合不同node上的結果后排序
            .setSearchType(SearchType.QUERY_THEN_FETCH)
            // 查詢的termName和termvalue
            .setQuery(qb)
            // 設置排序field
            .addSort(termName, SortOrder.DESC)
            // 設置分頁
            .setFrom(0).setSize(60).execute().actionGet();
        int tShards = sResponse.getTotalShards();
        long timeCost = sResponse.getTookInMillis();
        int sShards = sResponse.getSuccessfulShards();
        System.out.println(tShards + "," + timeCost + "," + sShards);
        SearchHits hits = sResponse.getHits();
        long count = hits.getTotalHits();
        SearchHit[] hitArray = hits.getHits();
        for (int i = 0; i < count; i++) {
          SearchHit hit = hitArray[i];
          Map<String, Object> fields = hit.getSource();
          for (String key : fields.keySet()) {
            System.out.println(key);
            System.out.println(fields.get(key));
          }
        }
  }
  private static void dateRangeSearch2(String indexName, String typeName,
      String termName, String from, String to) {
    // 構建range query
      QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(from).to(to);
      SearchResponse sResponse = client.prepareSearch(indexName)
          .setTypes(typeName)
          // 設置search type
          // 常用search type用:query_then_fetch
          // query_then_fetch是先查到相關結構,然后聚合不同node上的結果后排序
          .setSearchType(SearchType.QUERY_THEN_FETCH)
          // 查詢的termName和termvalue
          .setQuery(qb)
          // 設置排序field
          .addSort(termName, SortOrder.DESC)
          // 設置分頁
          .setFrom(0).setSize(60).execute().actionGet();
      int tShards = sResponse.getTotalShards();
      long timeCost = sResponse.getTookInMillis();
      int sShards = sResponse.getSuccessfulShards();
      System.out.println(tShards + "," + timeCost + "," + sShards);
      SearchHits hits = sResponse.getHits();
      long count = hits.getTotalHits();
      SearchHit[] hitArray = hits.getHits();
      for (int i = 0; i < count; i++) {
        SearchHit hit = hitArray[i];
        Map<String, Object> fields = hit.getSource();
        for (String key : fields.keySet()) {
          System.out.println(key);
          System.out.println(fields.get(key));
        }
      }
  }
  private static void countWithQuery(String indexName, String typeName, String termName, String termValue, String sortField, String highlightField) {
    //search result get source
        CountResponse cResponse = client.prepareCount(indexName)
            .setTypes(typeName)
            .setQuery(QueryBuilders.termQuery(termName, termValue))
            .execute()
            .actionGet();
        int tShards = cResponse.getTotalShards();
        int sShards = cResponse.getSuccessfulShards();
        System.out.println(tShards+","+sShards);
        long count = cResponse.getCount();   
  }
  private static void rangeSearchWithOtherSearch(String indexName, String typeName,
      String termName, String min, String max, String termQueryField) {
    // 構建range query
        QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(min).to(max);
        TermQueryBuilder tb = QueryBuilders.termQuery(termName, termQueryField);
        BoolQueryBuilder bq = boolQuery().must(qb).must(tb);
        SearchResponse sResponse = client.prepareSearch(indexName)
            .setTypes(typeName)
            // 設置search type
            // 常用search type用:query_then_fetch
            // query_then_fetch是先查到相關結構,然后聚合不同node上的結果后排序
            .setSearchType(SearchType.QUERY_THEN_FETCH)
            // 查詢的termName和termvalue
            .setQuery(bq)
            // 設置排序field
            .addSort(termName, SortOrder.DESC)
            // 設置分頁
            .setFrom(0).setSize(60).execute().actionGet();
        int tShards = sResponse.getTotalShards();
        long timeCost = sResponse.getTookInMillis();
        int sShards = sResponse.getSuccessfulShards();
        System.out.println(tShards + "," + timeCost + "," + sShards);
        SearchHits hits = sResponse.getHits();
        long count = hits.getTotalHits();
        SearchHit[] hitArray = hits.getHits();
        for (int i = 0; i < count; i++) {
          SearchHit hit = hitArray[i];
          Map<String, Object> fields = hit.getSource();
          for (String key : fields.keySet()) {
            System.out.println(key);
            System.out.println(fields.get(key));
          }
        }
  }
  private static void termRangeSearch(String indexName, String typeName,
    String termName, String min, String max, String highlightField) {
    QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(min).to(max);
    SearchResponse sResponse = client.prepareSearch(indexName)
        .setTypes(typeName)
        // 設置search type
        // 常用search type用:query_then_fetch
        // query_then_fetch是先查到相關結構,然后聚合不同node上的結果后排序
        .setSearchType(SearchType.QUERY_THEN_FETCH)
        // 查詢的termName和termvalue
        .setQuery(qb)
        // 設置排序field
        .addSort(termName, SortOrder.DESC)
        //設置高亮field
        .addHighlightedField(highlightField)
        // 設置分頁
        .setFrom(0).setSize(60).execute().actionGet();
    int tShards = sResponse.getTotalShards();
    long timeCost = sResponse.getTookInMillis();
    int sShards = sResponse.getSuccessfulShards();
    System.out.println(tShards + "," + timeCost + "," + sShards);
    SearchHits hits = sResponse.getHits();
    long count = hits.getTotalHits();
    SearchHit[] hitArray = hits.getHits();
    for (int i = 0; i < count; i++) {
      SearchHit hit = hitArray[i];
      Map<String, Object> fields = hit.getSource();
      for (String key : fields.keySet()) {
        System.out.println(key);
        System.out.println(fields.get(key));
      }
    }
  }
  private static void sumOneField(String indexName, String typeName, String fieldName) {
    SumBuilder sb = AggregationBuilders.sum("sum").field(fieldName);
    //search result get source
    SearchResponse sResponse = client.prepareSearch(indexName).setTypes(typeName).addAggregation(sb).execute().actionGet();
    Map<String, Aggregation> aggMap = sResponse.getAggregations().asMap();
    if(aggMap != null && aggMap.size() > 0) {
      for(String key : aggMap.keySet()) {
        Sum s = (Sum)aggMap.get(key);
        System.out.println(s.getValue());
      }
    }
  }
  private static void searchWithTermQueryAndRetureSpecifiedFields(String indexName, String typeName, String termName,String termValue, String sortField, String highlightField,String... fields) {
     SearchRequestBuilder sb = client.prepareSearch(indexName)
        .setTypes(typeName)
        // 設置search type
        // 常用search type用:query_then_fetch
        // query_then_fetch是先查到相關結構,然后聚合不同node上的結果后排序
        .setSearchType(SearchType.QUERY_THEN_FETCH)
        // 查詢的termName和termvalue
        .setQuery(QueryBuilders.termQuery(termName, termValue))
        // 設置排序field
        .addSort(sortField, SortOrder.DESC)
        // 設置高亮field
        .addHighlightedField(highlightField)
        // 設置分頁
        .setFrom(0).setSize(60);
    for (String field : fields) {
      sb.addField(field);
    }
    SearchResponse sResponse = sb.execute().actionGet();
    SearchHits hits = sResponse.getHits();
    long count = hits.getTotalHits();
    SearchHit[] hitArray = hits.getHits();
    for (int i = 0; i < count; i++) {
      SearchHit hit = hitArray[i];
      Map<String, SearchHitField> fm = hit.getFields();
      for (String key : fm.keySet()) {
        SearchHitField f = fm.get(key);
        System.out.println(f.getName());
        System.out.println(f.getValue());
      }
    }
  }
  private static void searchWithIds(String indexName, String typeName, String sortField, String highlightField, String... ids) {
    IdsQueryBuilder qb = QueryBuilders.idsQuery().addIds(ids);
    SearchResponse sResponse = client.prepareSearch(indexName)
        .setTypes(typeName)
        //設置search type
        //常用search type用:query_then_fetch
        //query_then_fetch是先查到相關結構,然后聚合不同node上的結果后排序
        .setSearchType(SearchType.QUERY_THEN_FETCH)
        //查詢的termName和termvalue
        .setQuery(qb)
        //設置排序field
        .addSort(sortField, SortOrder.DESC)
        //設置高亮field
        .addHighlightedField(highlightField)
        //設置分頁
        .setFrom(0).setSize(60)
        .execute()
        .actionGet();
    int tShards = sResponse.getTotalShards();
    long timeCost = sResponse.getTookInMillis();
    int sShards = sResponse.getSuccessfulShards();
    System.out.println(tShards+","+timeCost+","+sShards);
    SearchHits hits = sResponse.getHits();
    long count = hits.getTotalHits();
    SearchHit[] hitArray = hits.getHits();
    for(int i = 0; i < count; i++) {
      SearchHit hit = hitArray[i];
      Map<String, Object> fields = hit.getSource();
      for(String key : fields.keySet()) {
        System.out.println(key);
        System.out.println(fields.get(key));
      }
    }
  }
 
  /**
   * 在index:indexName, type:typeName中做通配符查詢
   * @param indexName
   * @param typeName
   * @param termName
   * @param termValue
   * @param sortField
   * @param highlightField
   */
  private static void wildcardSearch(String indexName, String typeName, String termName, String termValue, String sortField, String highlightField) {
    QueryBuilder qb = QueryBuilders.wildcardQuery(termName, termValue);
    SearchResponse sResponse = client.prepareSearch(indexName)
        .setTypes(typeName)
        //設置search type
        //常用search type用:query_then_fetch
        //query_then_fetch是先查到相關結構,然后聚合不同node上的結果后排序
        .setSearchType(SearchType.QUERY_THEN_FETCH)
        //查詢的termName和termvalue
        .setQuery(qb)
        //設置排序field
//       .addSort(sortField, SortOrder.DESC)
        //設置高亮field
//       .addHighlightedField(highlightField)
        //設置分頁
        .setFrom(0).setSize(60)
        .execute()
        .actionGet();
    int tShards = sResponse.getTotalShards();
    long timeCost = sResponse.getTookInMillis();
    int sShards = sResponse.getSuccessfulShards();
    System.out.println(tShards+","+timeCost+","+sShards);
    SearchHits hits = sResponse.getHits();
    long count = hits.getTotalHits();
    SearchHit[] hitArray = hits.getHits();
    for(int i = 0; i < count; i++) {
      SearchHit hit = hitArray[i];
      Map<String, Object> fields = hit.getSource();
      for(String key : fields.keySet()) {
        System.out.println(key);
        System.out.println(fields.get(key));
      }
    }
  }
 
  /**
   * 在index:indexName, type:typeName中做模糊查詢
   * @param indexName
   * @param typeName
   * @param termName
   * @param termValue
   * @param sortField
   * @param highlightField
   */
  private static void fuzzySearch(String indexName, String typeName, String termName, String termValue, String sortField, String highlightField) {
     QueryBuilder qb = QueryBuilders.fuzzyQuery(termName, termValue);
    SearchResponse sResponse = client.prepareSearch(indexName)
        .setTypes(typeName)
        //設置search type
        //常用search type用:query_then_fetch
        //query_then_fetch是先查到相關結構,然后聚合不同node上的結果后排序
        .setSearchType(SearchType.QUERY_THEN_FETCH)
        //查詢的termName和termvalue
        .setQuery(qb)
        //設置排序field
        .addSort(sortField, SortOrder.DESC)
        //設置高亮field
        .addHighlightedField(highlightField)
        //設置分頁
        .setFrom(0).setSize(60)
        .execute()
        .actionGet();
    int tShards = sResponse.getTotalShards();
    long timeCost = sResponse.getTookInMillis();
    int sShards = sResponse.getSuccessfulShards();
    System.out.println(tShards+","+timeCost+","+sShards);
    SearchHits hits = sResponse.getHits();
    long count = hits.getTotalHits();
    SearchHit[] hitArray = hits.getHits();
    for(int i = 0; i < count; i++) {
      SearchHit hit = hitArray[i];
      Map<String, Object> fields = hit.getSource();
      for(String key : fields.keySet()) {
        System.out.println(key);
        System.out.println(fields.get(key));
      }
    }
  }
  /**
   * 在index:indexName, type:typeName中做區間查詢
   * @param indexName
   * @param typeName
   * @param termName
   * @param min
   * @param max
   * @param highlightField
   */
  private static void numericRangeSearch(String indexName, String typeName,
      String termName, double min, double max, String highlightField) {
    // 構建range query
    QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(min).to(max);
    SearchResponse sResponse = client.prepareSearch(indexName)
        .setTypes(typeName)
        // 設置search type
        // 常用search type用:query_then_fetch
        // query_then_fetch是先查到相關結構,然后聚合不同node上的結果后排序
        .setSearchType(SearchType.QUERY_THEN_FETCH)
        // 查詢的termName和termvalue
        .setQuery(qb)
        // 設置排序field
        .addSort(termName, SortOrder.DESC)
        //設置高亮field
        .addHighlightedField(highlightField)
        // 設置分頁
        .setFrom(0).setSize(60).execute().actionGet();
    int tShards = sResponse.getTotalShards();
    long timeCost = sResponse.getTookInMillis();
    int sShards = sResponse.getSuccessfulShards();
    System.out.println(tShards + "," + timeCost + "," + sShards);
    SearchHits hits = sResponse.getHits();
    long count = hits.getTotalHits();
    SearchHit[] hitArray = hits.getHits();
    for (int i = 0; i < count; i++) {
      SearchHit hit = hitArray[i];
      Map<String, Object> fields = hit.getSource();
      for (String key : fields.keySet()) {
        System.out.println(key);
        System.out.println(fields.get(key));
      }
    }
  }
  /**
   * 在索引indexName, type為typeName中查找兩個term:term1(termName1, termValue1)和term2(termName2, termValue2)
   * @param indexName
   * @param typeName
   * @param termName1
   * @param termValue1
   * @param termName2
   * @param termValue2
   * @param sortField
   * @param highlightField
   */
  private static void searchWithBooleanQuery(String indexName, String typeName, String termName1, String termValue1, 
       String termName2, String termValue2, String sortField, String highlightField) {
    //構建boolean query
    BoolQueryBuilder bq = boolQuery().must(termQuery(termName1, termValue1)).must(termQuery(termName2, termValue2));  
    SearchResponse sResponse = client.prepareSearch(indexName)
        .setTypes(typeName)
        //設置search type
        //常用search type用:query_then_fetch
        //query_then_fetch是先查到相關結構,然后聚合不同node上的結果后排序
        .setSearchType(SearchType.QUERY_THEN_FETCH)
        //查詢的termName和termvalue
        .setQuery(bq)
        //設置排序field
        .addSort(sortField, SortOrder.DESC)
        //設置高亮field
        .addHighlightedField(highlightField)
        //設置分頁
        .setFrom(0).setSize(60)
        .execute()
        .actionGet();
    int tShards = sResponse.getTotalShards();
    long timeCost = sResponse.getTookInMillis();
    int sShards = sResponse.getSuccessfulShards();
    System.out.println(tShards+","+timeCost+","+sShards);
    SearchHits hits = sResponse.getHits();
    long count = hits.getTotalHits();
    SearchHit[] hitArray = hits.getHits();
    for(int i = 0; i < count; i++) {
      SearchHit hit = hitArray[i];
      Map<String, Object> fields = hit.getSource();
      for(String key : fields.keySet()) {
        System.out.println(key);
        System.out.println(fields.get(key));
      }
    }
  }
  /**
   * 在索引indexName, type為typeName中查找term(termName, termValue)
   * @param indexName
   * @param typeName
   * @param termName
   * @param termValue
   * @param sortField
   * @param highlightField
   */
  private static void searchWithTermQuery(String indexName, String typeName, String termName, String termValue, String sortField, String highlightField) {
    SearchResponse sResponse = client.prepareSearch(indexName)
        .setTypes(typeName)
        //設置search type
        //常用search type用:query_then_fetch
        //query_then_fetch是先查到相關結構,然后聚合不同node上的結果后排序
        .setSearchType(SearchType.QUERY_THEN_FETCH)
        //查詢的termName和termvalue
        .setQuery(QueryBuilders.termQuery(termName, termValue))
        //設置排序field
//       .addSort(sortField, SortOrder.DESC)
        //設置高亮field
//       .addHighlightedField(highlightField)
        //設置分頁
        .setFrom(0).setSize(60)
        .execute()
        .actionGet();
    int tShards = sResponse.getTotalShards();
    long timeCost = sResponse.getTookInMillis();
    int sShards = sResponse.getSuccessfulShards();
    SearchHits hits = sResponse.getHits();
    long count = hits.getTotalHits();
    SearchHit[] hitArray = hits.getHits();
    for(int i = 0; i < count; i++) {
      System.out.println("==================================");
      SearchHit hit = hitArray[i];
      Map<String, Object> fields = hit.getSource();
      for(String key : fields.keySet()) {
        System.out.println(key);
        System.out.println(fields.get(key));
      }
    }
  }
  /**
   * 用java的map構建document
   */
  private static void indexWithMap(String indexName, String typeName) {
    Map<String, Object> json = new HashMap<String, Object>();
    //設置document的field
    json.put("user","kimchy2");
    json.put("postDate",new Date());
    json.put("price",6.4);
    json.put("message","Elasticsearch");
    json.put("tid","10002");
    json.put("endTime","2015-08-25 09:00:00");
    //指定索引名稱,type名稱和documentId(documentId可選,不設置則系統自動生成)創建document
    IndexResponse response = client.prepareIndex(indexName, typeName, "2").setSource(json).execute().actionGet();
    //response中返回索引名稱,type名稱,doc的Id和版本信息
    String index = response.getIndex();
    String type = response.getType();
    String id = response.getId();
    long version = response.getVersion();
    boolean created = response.isCreated();
    System.out.println(index+","+type+","+id+","+version+","+created);
  }
 
  /**
   * 用java字符串創建document
   */
  private static void indexWithStr(String indexName, String typeName) {
    //手工構建json字符串
    //該document包含user, postData和message三個field
    String json = "{" + "\"user\":\"kimchy\"," + "\"postDate\":\"2013-01-30\"," + "\"price\":\"6.3\"," + "\"tid\":\"10001\"," + "}";
    //指定索引名稱,type名稱和documentId(documentId可選,不設置則系統自動生成)創建document
    IndexResponse response = client.prepareIndex(indexName, typeName, "1")
        .setSource(json)
        .execute()
        .actionGet();
    //response中返回索引名稱,type名稱,doc的Id和版本信息
    String index = response.getIndex();
    String type = response.getType();
    String id = response.getId();
    long version = response.getVersion();
    boolean created = response.isCreated();
    System.out.println(index+","+type+","+id+","+version+","+created);
  }
   
  private static void deleteDocWithId(String indexName, String typeName, String docId) {
    DeleteResponse dResponse = client.prepareDelete(indexName, typeName, docId).execute().actionGet();
    String index = dResponse.getIndex();
    String type = dResponse.getType();
    String id = dResponse.getId();
    long version = dResponse.getVersion();
    System.out.println(index+","+type+","+id+","+version);
  }
   
  /**
   * 創建索引
   * 注意:在生產環節中通知es集群的owner去創建index
   * @param client
   * @param indexName
   * @param documentType
   * @throws IOException
   */
  private static void createIndex(String indexName, String documentType) throws IOException {
    final IndicesExistsResponse iRes = client.admin().indices().prepareExists(indexName).execute().actionGet();
    if (iRes.isExists()) {
      client.admin().indices().prepareDelete(indexName).execute().actionGet();
    }
    client.admin().indices().prepareCreate(indexName).setSettings(Settings.settingsBuilder().put("number_of_shards", 1).put("number_of_replicas", "0")).execute().actionGet();
    XContentBuilder mapping = jsonBuilder()
        .startObject()
           .startObject(documentType)
//           .startObject("_routing").field("path","tid").field("required", "true").endObject()
           .startObject("_source").field("enabled", "true").endObject()
           .startObject("_all").field("enabled", "false").endObject()
             .startObject("properties")
               .startObject("user")
                 .field("store", true)
                 .field("type", "string")
                 .field("index", "not_analyzed")
                .endObject()
                .startObject("message")
                 .field("store", true)
                 .field("type","string")
                 .field("index", "analyzed")
                 .field("analyzer", "standard")
                .endObject()
                .startObject("price")
                 .field("store", true)
                 .field("type", "float")
                .endObject()
                .startObject("nv1")
                 .field("store", true)
                 .field("type", "integer")
                 .field("index", "no")
                 .field("null_value", 0)
                .endObject()
                .startObject("nv2")
                 .field("store", true)
                 .field("type", "integer")
                 .field("index", "not_analyzed")
                 .field("null_value", 10)
                .endObject()
                .startObject("tid")
                 .field("store", true)
                 .field("type", "string")
                 .field("index", "not_analyzed")
                .endObject()
                .startObject("endTime")
                 .field("type", "date")
                 .field("store", true)
                 .field("index", "not_analyzed")
                 .field("format", "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd'T'HH:mm:ss.SSSZ")
                .endObject()
                .startObject("date")
                 .field("type", "date")
                .endObject()
             .endObject()
           .endObject()
          .endObject();
    client.admin().indices()
        .preparePutMapping(indexName)
        .setType(documentType)
        .setSource(mapping)
        .execute().actionGet();
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/antao592/article/details/52872854

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品一卡2卡3卡4卡5卡亚洲 | 免费看美女被靠到爽的视频 | 777午夜精品免费播放 | 236宅宅2021最新理论 | 欧美日韩精品一区二区三区视频播放 | 亚洲国产精品日韩高清秒播 | 狠狠色婷婷日日综合五月 | 猛操女人 | 97超pen个人视频公开视频视 | 非洲黑人又大粗gay 非洲黑人bbwbbwbbw | 日韩不卡一区二区 | 韩国成人毛片aaa黄 含羞草国产亚洲精品岁国产精品 | 母乳在线 | fuqer日本| 免看一级a一片成人123 | 天天色资料 | 鬼畜重口高h合集长短篇 | 耽美调教高h | 国产精品久久久久久吹潮 | 日本艳鉧动漫1~6完整版在 | 国产在线观看福利 | 美国高清xxxxx18 | 国产成人免费片在线观看 | 色老妇 | 精品久久99麻豆蜜桃666 | 国产欧美一区二区三区免费看 | 久久免费看少妇级毛片蜜臀 | 羞羞漫画视频 | 久久久久久久久人体 | 青青色综合 | 国产情侣视频观看 | 扒开女人下面使劲桶屁股动漫 | 国产综合久久久久久 | 草草视频免费看 | 涩涩五月天| 久久这里只有精品视频e | 免费稚嫩福利 | chinese老头和老太交hd | 国产自拍专区 | 人人人人看人人人做人人 | 男人狂躁女人下面狂叫图片 |