Springboo統合bboss-elasticsearch elasticsearchクライアントの実現

8266 ワード

コンテンツの概要
まず、本明細書で実装する内容を説明します.
1.bboss-elasticsearchとspringbootが持つspring-boot-starter-data-elasticsearchの長所と短所を比較する.データベースデータの全量、増分をelasticsearchサーバにインポートする場合3.EXcel、word、ppt、pdfなどのファイルをelasticsearchサーバに解析する.jsonファイル生成によりmapping 5を生成する.jsonファイルによるコンテンツ検索6を実現する.jsonファイルによるドキュメントのハイライトクエリー
1.bboss-elasticsearchとspring-boot-starter-data-elasticsearchの長所と短所
まずspring-boot-starter-data-elasticsearchについてお話しします.Springbootは独自で、シームレスに互換性があり、操作が簡単で、JSP操作データベースのようにelasticsearchサーバを操作することができますが、これは簡単なクエリーにすぎません.実際のアプリケーションでは、あまり単純なクエリーはありません(単純なクエリーであればesを使う必要もないでしょう).複雑なクエリーであれば、大量のコードロジックが必要で、理解が難しい.
bboss-elasticsearchは国産オープンソースフレームワークであり、query dsl構文操作と分散検索エンジンelasticsearchへのアクセスに基づくo/r mapping高性能開発ライブラリであり、下位層はes restful apiに基づいてmybatisのようにデータesサーバを操作することができます.
個人的にはbboss-elasticsearchsには2つのメリットがあると思います.1.操作データベースのインタフェースを提供し、データソースを追加しなくてもデータの全量、増分インポートを実現できる.オリジナルのquery、dsl文を使用すると、友好度が高く、学習と交流が便利になります.コードの読み取り可能性が高い.
2.bboss-elasticsearchの統合
本プロジェクトは6.2.4バージョンを使用しているため、6.0.2バージョンのjarパッケージを使用し、その他のesバージョンはElasticsearch Bboss開発ドキュメントを参照してください.


	com.bbossgroups.plugins
	bboss-elasticsearch-spring-boot-starter
    6.0.2



	com.bbossgroups.plugins
	bboss-elasticsearch-rest-jdbc
	6.0.2



mysql
mysql-connector-java


2.1関連構成
  resources   ,  
application.properties  ,    :
elasticsearch.rest.hostNames=xxx.xx.xx.x:9200
//  es            9200  
//es      elasticsearch.yml    http.port: 9200

2.2非同期バッチ同期
  • は、プロジェクトの開始に適用され、インデックスインポート関連データ
  • を作成する.
    //     
    ClientInterface clientUtil = ElasticSearchHelper.getRestClientUtil();
    if (clientUtil.existIndice(ConstUtil.MENU_INDEX)) {//    ,  ,        
    	clientUtil.dropIndice(ConstUtil.MENU_INDEX);
     } 
    String mapping = readMappingJson("mappings/menu.json");//        
    clientUtil.createIndiceMapping(ConstUtil.MENU_INDEX, mapping);//    
    
    DB2ESImportBuilder importBuilder = DB2ESImportBuilder.newInstance();
    //       sql  ,   ,          sql       ,           
    importBuilder.setSql("select * from test")
    	.setDbDriver(ConstUtil.DB_DRIVER)  
    	.setDbUrl("jdbc:mysql://xxx.xx.xx.x.69:3306/ccms?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useCursorFetch=true")
    	.setDbUser(ConstUtil.DB_USERNAME)
    	.setDbPassword(ConstUtil.DB_PASSWORD)
    	.setValidateSQL("select 1")
    	.setUsePool(false);//       
    	
    /**
     * es    
     */
    importBuilder
    		.setIndex(index) //        
    		.setIndexType(type) //        
    //.setRefreshOption("refresh")//   ,null       ,importBuilder.setRefreshOption("refresh");      
    .setUseJavaName(true) //   ,           java       ,  :doc_id -> docId
    .setBatchSize(5000)  //   ,    es    ,   -1,    ,> 0     
    .setJdbcFetchSize(10000);//        fetchsize,   mysql url   useCursorFetch=true  mysql   fetch  ,           ,jdbcFetchSize   useCursorFetch      ,        
    importBuilder.setFixedRate(false)//  jdk timer task   fixedRate   
    //	 .setScheduleDate(date) //          :  
     .setDeyLay(5000L); //       deylay     
    // .setPeriod(10000L); //  period    ,     ,     
    		 
    		 
    /**
     *   、            ,           elasticsearch  ,          
     */
    importBuilder.setParallel(true);//            
    importBuilder.setQueue(10);//               
    importBuilder.setThreadCount(50);//               
    importBuilder.setContinueOnError(true);//      ,        :true(   )     false       
    importBuilder.setAsyn(false);//true       ,             ,      ;false(   )       ,            ,            
    importBuilder.setEsIdField("_id");//      ,   ,       id
    importBuilder.setDebugResponse(true);//          reponse        ,  false,              ,         ,log          INFO
    importBuilder.setDiscardBulkResponse(false);//               ,      false,true   ,  true,                  
    
    DataStream dataStream = importBuilder.builder();
    dataStream.execute(); 				
    

    2.3タイミングインクリメンタル同期
    //     
    ClientInterface clientUtil = ElasticSearchHelper.getRestClientUtil();
    if (clientUtil.existIndice(ConstUtil.MENU_INDEX)) {//    ,  ,        
    	clientUtil.dropIndice(ConstUtil.MENU_INDEX);
     } 
    String mapping = readMappingJson("mappings/menu.json");//        
    clientUtil.createIndiceMapping(ConstUtil.MENU_INDEX, mapping);//    
    
    DB2ESImportBuilder importBuilder = DB2ESImportBuilder.newInstance();
    //       sql  ,   ,          sql       ,           
    importBuilder.setSql("select * from test where last_update_time  > #[time]")//       time
    	.setDbDriver(ConstUtil.DB_DRIVER)  
    	.setDbUrl("jdbc:mysql://xxx.xx.xx.x.69:3306/ccms?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useCursorFetch=true")
    	.setDbUser(ConstUtil.DB_USERNAME)
    	.setDbPassword(ConstUtil.DB_PASSWORD)
    	.setValidateSQL("select 1")
    	.setUsePool(true);//       
    	
    /**
     * es    
     */
    importBuilder
    		.setIndex(index) //        
    		.setIndexType(type) //        
    //.setRefreshOption("refresh")//   ,null       ,importBuilder.setRefreshOption("refresh");      
    .setUseJavaName(true) //   ,           java       ,  :doc_id -> docId
    .setBatchSize(5000)  //   ,    es    ,   -1,    ,> 0     
    .setJdbcFetchSize(10000);//        fetchsize,   mysql url   useCursorFetch=true  mysql   fetch  ,           ,jdbcFetchSize   useCursorFetch      ,        
    importBuilder.setFixedRate(false)//  jdk timer task   fixedRate   
    //	 .setScheduleDate(date) //          :  
     .setDeyLay(5000L); //       deylay     
     .setPeriod(10000L); //  period    ,     ,     
    //	importBuilder.setNumberLastValueColumn("log_id");//            ,         sql                     ,           
    //	importBuilder.setNumberLastValueColumn("log_id");//            ,         sql                     ,           
    importBuilder.setFromFirst(true);//     ,        ,              ,       ,            
    importBuilder.setLastValueStorePath("testdb");//                 ,      (     )       
    //	importBuilder.setLastValueStoreTableName("test");//              ,     ,      increament_tab
    importBuilder.setLastValueType(ImportIncreamentConfig.NUMBER_TYPE);//              ,         :ImportIncreamentConfig.NUMBER_TYPE     
    //   ImportIncreamentConfig.TIMESTAMP_TYPE     		 		 
    
    /**
     *   、            ,           elasticsearch  ,          
     */
    importBuilder.setParallel(true);//            
    importBuilder.setQueue(10);//               
    importBuilder.setThreadCount(50);//               
    importBuilder.setContinueOnError(true);//      ,        :true(   )     false       
    importBuilder.setAsyn(false);//true       ,             ,      ;false(   )       ,            ,            
    importBuilder.setEsIdField("_id");//      ,   ,       id
    importBuilder.setDebugResponse(true);//          reponse        ,  false,              ,         ,log          INFO
    importBuilder.setDiscardBulkResponse(false);//               ,      false,true   ,  true,                  
    
    DataStream dataStream = importBuilder.builder();
    dataStream.execute(); 				
    

    2.4 officeドキュメントの内容をesに同期する
             ,         
    1.    
    2.    es    :
    importBuilder.setDataRefactor(new DataRefactor() {
    	@Override
    	public void refactor(Context context) throws Exception {
    		String url = (String) context.getValue("url");
    
    		DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    		LocalDateTime parse = LocalDateTime.parse(context.getValue("time").toString(),dateTimeFormatter); 
    		Date date = Date.from(parse.toInstant(ZoneOffset.of("+8")));
    		
    		String base64Txt = DocUtil.extractTextFromFile(url );
    		Doc doc = new Doc((String) context.getValue("title"),(String) context.getValue("name"),base64Txt,date);
    	
    		ClientInterface clientUtil = ElasticSearchHelper.getRestClientUtil();    
    
    		clientUtil.addDocument(ConstUtil.DOC_INDEX,"doc?pipeline=attachment",doc);//      
    	}
    });
    

    未完待機