Try   HackMD

Elastic App Search 後端連接

Elastic App Search 後端連接有兩種方式,一種是透過ELK的Elastic 去取得 Elastic App
的資料,第二種是直接用Java 打API的方式,去取得 Elastic App Search 的資料


  1. 取得Elastic App Search 的 index,可以從Kibana取得所有的Elastic 列表,GET
    _cat/indices?v&index=*engine*

  2. 回傳的結果

    health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
    green open .ent-search-engine-documents-hktv N3UnO9mkRYS94RJnxUi23w 2 1 100 0 1.9mb 993.9kb
  3. 會有多個 index,可以用docs.count 來判斷,Elastic App Search 的 index

  4. 使用之前的遠端連結範例

    遠端連接

    ​​​​public static void main(String[] args ) throws IOException { ​​​​ // 建立連線端 這裡的是ELK的使用者名稱密碼與Host ​​​​ String username = "yourname"; ​​​​ String password = "yourpassword"; ​​​​ String host = "yourHost"; ​​​​ int port = 9243; ​​​​ int nextPort = 9244; ​​​​ String protocol = "https"; ​​​​ final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); ​​​​ credentialsProvider.setCredentials( ​​​​ AuthScope.ANY, ​​​​ new UsernamePasswordCredentials(username, password)); ​​​​ RestClientBuilder Builder = RestClient.builder( ​​​​ new HttpHost(host, port, protocol), ​​​​ new HttpHost(host, nextPort, protocol)) ​​​​ .setHttpClientConfigCallback((h) -> h.setDefaultCredentialsProvider(credentialsProvider)); ​​​​ try (RestHighLevelClient client = new RestHighLevelClient(Builder)) { ​​​​ //搜尋的Key與一般搜尋ELK不同,可能會因版本差異而改變 ​​​​ QueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name_zh$string", "貓砂").fuzziness(Fuzziness.AUTO);; ​​​​ SearchSourceBuilder searchBuilder = SearchSourceBuilder.searchSource().query(matchQueryBuilder).size(50); ​​​​ // index 的名稱 ​​​​ SearchRequest request = new SearchRequest(".yourIndex").source(searchBuilder); ​​​​ SearchHits hits = client.search(request, RequestOptions.DEFAULT).getHits(); ​​​​ // 逐筆取資料 ​​​​ for(SearchHit hit : hits) { ​​​​ Map<String, Object> sourceAsMap = hit.getSourceAsMap(); ​​​​ String name_zh = (String) sourceAsMap.get("name_zh$string"); ​​​​ String selling_price = (String) sourceAsMap.get("selling_price$string"); ​​​​ System.out.println(String.format("NameZH:%s selling_price:%s ",name_zh, selling_price)); ​​​​ } ​​​​ }catch (IOException ignored) {} ​​​​}