1. 程式人生 > >Elasticsearch學習之Java操作1

Elasticsearch學習之Java操作1

默認 time field java客戶端 OS should timeval nodes spa

1. Elasticsearch為Java用戶提供了兩種內置客戶端
1.1 節點客戶端(node client):
    節點客戶端以無數據節點(none data node)身份加入集群,換言之,它自己不存儲任何數據,但是它知道數據在集群中的具體位置,並且能夠直接轉發請求到對應的節點上。
傳輸客戶端(Transport client):這個更輕量的傳輸客戶端能夠發送請求到遠程集群。它自己不加入集群,只是簡單轉發請求給集群中的節點。
兩個Java客戶端都通過9300端口與集群交互,使用Elasticsearch傳輸協議(Elasticsearch Transport Protocol)。集群中的節點之間也通過9300端口進行通信。如果此端口未開放,你的節點將不能組成集群。+
Java客戶端所在的Elasticsearch版本必須與集群中其他節點一致,否則,它們可能互相無法識別。
1.2 通過transportClient來連接集群(推薦)
 public void before11() throws Exception {
         // 創建客戶端, 使用的默認集群名, "elasticSearch"
       // client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("www.wenbronk.com"), 9300));
        // 通過setting對象指定集群配置信息, 配置的集群名
        Settings settings = Settings.settingsBuilder().put("cluster.name", "elasticsearch_wenbronk") //
設置集群名 // .put("client.transport.sniff", true) // 開啟嗅探 , 開啟後會一直連接不上, 原因未知 // .put("network.host", "192.168.50.37") .put("client.transport.ignore_cluster_name", true) // 忽略集群名字驗證, 打開後集群名字不對也能連接上 // .put("client.transport.nodes_sampler_interval", 5) //報錯,
// .put("client.transport.ping_timeout", 5) // 報錯, ping等待時間, .build(); client = TransportClient.builder().settings(settings).build() .addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("192.168.50.37", 9300))); // 默認5s // 多久打開連接, 默認5s System.out.println("success connect"); }

2. 使用QueryBuilder 進行查詢

使用QueryBuilder
  2.1 termQuery("key", obj) 完全匹配
  2.1 termsQuery("key", obj1, obj2..) 一次匹配多個值
  2.3 matchQuery("key", Obj) 單個匹配, field不支持通配符, 前綴具高級特性
  2.4 multiMatchQuery("text", "field1", "field2"..); 匹配多個字段, field有通配符就行
  2.5 matchAllQuery(); 匹配所有文件

@Test
    public void testQueryBuilder() {
//        QueryBuilder queryBuilder = QueryBuilders.termQuery("user", "kimchy");
      QueryBUilder queryBuilder = QueryBuilders.termQuery("user", "kimchy", "wenbronk", "vini");
        QueryBuilders.termsQuery("user", new ArrayList<String>().add("kimchy"));
//        QueryBuilder queryBuilder = QueryBuilders.matchQuery("user", "kimchy");
//        QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("kimchy", "user", "message", "gender");
        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
        searchFunction(queryBuilder);
        
    }
2.6 查詢遍歷
 private void searchFunction(QueryBuilder queryBuilder) {
        SearchResponse response = client.prepareSearch("twitter")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setScroll(new TimeValue(60000))
                .setQuery(queryBuilder)
                .setSize(100).execute().actionGet();
        
        while(true) {
            response = client.prepareSearchScroll(response.getScrollId())
                .setScroll(new TimeValue(60000)).execute().actionGet();
            for (SearchHit hit : response.getHits()) {
                Iterator<Entry<String, Object>> iterator = hit.getSource().entrySet().iterator();
                while(iterator.hasNext()) {
                    Entry<String, Object> next = iterator.next();
                    System.out.println(next.getKey() + ": " + next.getValue());
                    if(response.getHits().hits().length == 0) {
                        break;
                    }
                }
            }
            break;
        }
//        testResponse(response);
    }

2.7 組合查詢
  must(QueryBuilders) : AND
  mustNot(QueryBuilders): NOT
  should: : OR

  @Test
    public void testQueryBuilder2() {
        QueryBuilder queryBuilder = QueryBuilders.boolQuery()
            .must(QueryBuilders.termQuery("user", "kimchy"))
            .mustNot(QueryBuilders.termQuery("message", "nihao"))
            .should(QueryBuilders.termQuery("gender", "male"));
        searchFunction(queryBuilder);
    }

Elasticsearch學習之Java操作1