solr與.net系列課程(三)solr連接數據庫


 solr與.net系列課程(三)solr連接數據庫

    上一章直接講述的配置文件把大部分人看的很迷惑,大家都想聽的是solr到底是怎么用的,好,這一節我們就開始鏈接數據庫,首先講一下連接之前都要配置哪些文件

    1.先下載連接sqlserver的驅動(sqljdbc4.jar)sqljdbc4.jar,),將其復制到C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\solr\WEB-INF\lib (C:\Program Files\Apache Software Foundation\Tomcat 7.0為tomcat安裝路徑)
    2.在C:\Program Files\Apache Software Foundation\Tomcat 7.0\solr\collection1\conf下新建data-config.xml文件(名字任意,路徑也可以任意)
    3.在C:\Program Files\Apache Software Foundation\Tomcat 7.0\solr\collection1\conf \solrconfig.xml,文件里配置data-confing.xml路徑

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">  
    <lst name="defaults">  
          <str name="config">C:\Program Files\Apache Software Foundation\Tomcat 7.0\solr\collection1\conf\data-config.xml</str>  
    </lst>  
</requestHandler>

    4.將solr4.72文件夾下的dist, contrib文件夾復制到C:\Program Files\Apache Software Foundation\Tomcat 7.0\
    5.在C:\Program Files\Apache Software Foundation\Tomcat 7.0\solr\collection1\conf \solrconfig.xml,文件里配置dist, contrib這兩個文件夾的路徑(solrconfig.xml已存在這些路徑,如果以你放置的路徑不一樣,修改一下就可以了)

 <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/contrib/extraction/lib" regex=".*\.jar" />
  <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/dist/" regex="solr-cell-\d.*\.jar" />

  <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/contrib/clustering/lib/" regex=".*\.jar" />
  <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/dist/" regex="solr-clustering-\d.*\.jar" />

  <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/contrib/langid/lib/" regex=".*\.jar" />
  <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/dist/" regex="solr-langid-\d.*\.jar" />

  <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/contrib/velocity/lib" regex=".*\.jar" />
  <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/dist/" regex="solr-velocity-\d.*\.jar" />

   <lib dir="C:/Program Files/Apache Software Foundation/Tomcat 7.0/dist/" regex="solr-dataimporthandler-\d.*\.jar" />  

    6.將dist文件夾下的這兩個文件復制到與數據庫驅動同一個文件夾下    

    以上配置的路徑我是用絕對路徑配置的,也可以用相對路徑,

    以上就是需要配置的內容了,下面我將結合前一節的內容,講解如何配置連接數據庫

    首先是配置data-confing.xml文件,data-confing.xml文件就是連接數據庫的配置文件(剛才新建的),將如下代碼粘貼到該文件中

<?xml version="1.0" encoding="UTF-8"?>  
<dataConfig>
    <dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://192.168.0.8;DatabaseName=test" user="sa" password="123"/>
    <document name="Info">
            
        <entity name="zpxx"  transformer="ClobTransformer" pk="id"
                 query="select id, name from table"        
                 deltaImportQuery="select id, name from table"    
                 deltaQuery="SELECT id FROM table where adddate > '${dataimporter.last_index_time}'">             
                    <field column=“id"      name=“id"      />  
                    <field column=“name"      name=“name"      />  
         </entity>
    </document>
    </dataConfig>

 

      我們來分析一下上面的代碼

    <dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://192.168.0.8;DatabaseName=test" user="sa" password="123"/>

      這個顯而易見,就是連接數據庫的字符串了

<document name="Info">
        <entity name="zpxx"  transformer="ClobTransformer" pk="id"
                 query="select id, name from table"        
                 deltaImportQuery="select id, name from table"    
                 deltaQuery="SELECT id FROM table where adddate > '${dataimporter.last_index_time}'">             
                    <field column=“id"      name=“solrid"      />  
                    <field column=“name"      name=“name"      />  
         </entity>
    </document>

 

     這個就是從哪張表里取數據了的sql語句了   

     query是獲取全部數據的SQL(solr從sql中獲取那些數據)
     deltaImportQuery是獲取增量數據時使用的SQL(數據庫新增數據是,追加到solr的數據)
     deltaQuery是獲取pk的SQL(數據庫新增數據是,追加到solr的數據時的條件,根據id ,條件是最后一次獲取的時間,${dataimporter.last_index_time,最后獲取的時間})

 <field column=“id"      name=“id"      />  
 <field column=“name"    name=“solrname"      />  

     這個就是數據庫與solr的映射關系了,在上一節schema.xml中定義的field子節點對應,那么根據本屆內容field就要這么定義

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
   <field name="solrname" type=" string " indexed="true" stored="true" omitNorms="true"/>

     其他的field就可以刪掉了(初學者不要刪,容易出問題),也可以多定義一些備用,這樣table表中id下的數據就存儲在了solr中id的位置,name就存儲在solrname下了

 <field name="_version_" type="long" indexed="true" stored="true"/>
   
   <!-- points to the root document of a block of nested documents. Required for nested
      document support, may be removed otherwise
   -->
   <field name="_root_" type="string" indexed="true" stored="false"/>

      這個不要刪,這是solr自已自己內部的字段,刪掉會報錯,這樣solr就配置完成.

 

      之前有朋友問到過多數據庫多表的問題,很簡單,先說多表的問題:

      <entity> …..  </entity> 每一個 entiy就是一張表,有幾張表就寫幾個,這里就要注意一個問題了,單核的solr是把所有的數據存儲在在一個文件中,上文中結束的時候說道, schema.xml這個文件可以設置主鍵(一定要有主鍵),默認是id, data-confing.xml,文件定義每張表時也指定了主鍵,沒寫默認id,多張表示就要注意id的唯一行了,平時我們總是喜歡使用自增id,所以多張表的id肯定會重復,主鍵的重復solr是不會報錯了,但是遵循相同主鍵后一條覆蓋前一條,所以多張表時,就要考慮主鍵唯一的問題了,如果使用guid的形式那就沒問題了,(solr從數據庫獲取數據是按<entity> …..  </entity>的順序逐個表去取數據了),那如果非要主鍵重復存儲怎么辦,也可以,使用多核模式

       多表實例:

<?xml version="1.0" encoding="UTF-8"?>  
<dataConfig>
    <dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://192.168.0.8;DatabaseName="test" user="sa" password="123"/>
    <document name="Info">
            
        <entity name="zpxx"  transformer="ClobTransformer"
                 query="select id, name from table"        
                 deltaImportQuery="select id, name from table"    
                 deltaQuery="SELECT id FROM table where adddate > '${dataimporter.last_index_time}'">             
                    <field column=“id"      name=“id"      />  
                    <field column=“name"      name=“name"      />  
         </entity>

      
        <entity name="zpxx2"  transformer="ClobTransformer"
                 query="select id, name from table2"        
                 deltaImportQuery="select id, name from table2"    
                 deltaQuery="SELECT id FROM table2 where adddate > '${dataimporter.last_index_time}'">             
                    <field column=“id"      name=“id"      />  
                    <field column=“name"      name=“name"      />  
         </entity>
    </document>
    </dataConfig>

       現在再說一說多數據庫的問題了,一個配置文件可以配置多個數據源。增加一個dataSource元素就可以增加一個數據源了。name屬性可以區分不同的數據源。如果配置了多於一個的數據源,那么要注意將name配置成唯一的。

       多數據庫實例:

<dataSource type="JdbcDataSource" name="ds-1" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://db1-host/dbname" user="db_username" password="db_password"/>

<dataSource type="JdbcDataSource" name="ds-2" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://db2-host/dbname" user="db_username" password="db_password"/>



 然后這樣使用
    
..

<entity name="one" dataSource="ds-1" ...>

   ..

</entity>

<entity name="two" dataSource="ds-2" ...>

   ..

</entity>

..

     如果存在多表鏈接怎么辦,這個也可以解決, <entity> 中可以嵌套<entity>達到鏈接效果

     例:

   <entity name="item" query="select id name from item">                    

            <entity name="feature" query="select description  from feature where item_id='${item.ID}'"/>            

            <entity name="item_category" query="select phone from  item_category where  category _id='${item.ID}'">

            </entity>

        </entity>

     這個相當於 select a.id ,a.name ,b. description ,c. phone from item as a left join feature as b on a.id=b. item_id left join item_category as c on a.id=c. category _id
     這個鏈接也是有限制的:
           子Entity的query必須引用父Entity的pk
           子Entity的parentDeltaQuery必須引用自己的pk
           子Entity的parentDeltaQuery必須返回父Entity的pk
           deltaImportQuery引用的必須是自己的pk

     那說了這么多 我們來簡單的配置一個吧,現在有一張表tableA,有如下字段id ,name,address,phone,class,addtime 我想把這張表的數據存儲到solr中, 怎配置,首先在schema.xml 的 fields 節點配置索引字段,(name可以隨便起,type是類型,上文字提到過solr的類型,這里為了省事就都用string了)

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
   <field name="solrname" type=" string " indexed="true" stored="true" omitNorms="true"/>
<field name=" address " type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
   <field name="phone" type=" string " indexed="true" stored="true" omitNorms="true"/>
   <field name="class" type=" string " indexed="true" stored="true" omitNorms="true"/>
   <field name="addtime" type=" date" indexed="true" stored="true" omitNorms="true"/>

     上文中還提到過 copyfeild與DynamicField,這個可用可不用,怎樣用上文已經解釋了,solr中會自帶一些定義,想刪就刪,不刪也沒事,然后我們配置data-confing.xml,如下,

<dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://192.168.0.8;DatabaseName=test" user="sa" password="123"/>
    <document name="Info">
        <entity name=" test "  transformer="ClobTransformer" pk="id"

                 query="select id, name ,address,phone,class,addtime from tableA"        
                 deltaImportQuery=" select id, name ,address,phone,class,addtime from tableA"    
                 deltaQuery="SELECT id FROM tableA where addtime > '${dataimporter.last_index_time}'">          
                    <field column="id"      name="id"      />  
                    <field column="name"      name="solrname"      />  
                    <field column="address "      name=“address "      />  
                    <field column="phone "      name="phone "      /> 
                    <field column="class "      name="class "      />  
                    <field column="addtime "      name="addtime "      /> 
         </entity>
    </document>
    </dataConfig>

     好了,這樣就配置完成了,下面該開始執行了,執行有兩種方式

     先說第一種,瀏覽器執行方式:

     終止跑索引                  http://192.168.0.9:8080/solr/collection1/dataimport?command=abort

     開始索引                     http://192.168.0.9:8080/solr/collection1/dataimport?command=full-import

     增量索引                     http://192.168.0.9:8080/solr/collection1/dataimport?command=delta-import

     直接在瀏覽器中輸入 http://192.168.0.9:8080/solr/collection1/dataimport?command=full-import就可以了

     我們看看效果

 

    路徑是D盤是因為我只在另一台電腦上執行的,那個配置在D盤了

    這種方式我們看不到執行過程,執行時間

    Solr還提供了圖形化的執行方式,如下:

        Full Import工作原理
        執行本Entity的Query,獲取所有數據;
        針對每個行數據Row,獲取pk,組裝子Entity的Query;
        執行子Entity的Query,獲取子Entity的數據。

 

        Delta Import工作原理
        查找子Entity,直到沒有為止;
        執行Entity的deltaQuery,獲取變化數據的pk;
        合並子Entity parentDeltaQuery得到的pk;
        針對每一個pk Row,組裝父Entity的parentDeltaQuery;
        執行parentDeltaQuery,獲取父Entity的pk;
        執行deltaImportQuery,獲取自身的數據;
        如果沒有deltaImportQuery,就組裝Query

    小結,今天就講這么多吧,本來還想給大家展示個實例的,但是發現今天寫的有點多,大家應該先理解理解,那真實的案例就在下一節講述吧,我將為大家裝備一個300萬數據左右的表,讓大家看看實際效果,並為大家講述如何查詢,查詢參數等等.

    今天感覺寫的有點亂,寫完后面就忘了前面寫的什么了,其實這里面還有好多細節沒有講述,如果大家在使用過程中有什么問題,可以直接給我留言,我會及時為大家解答的.

   這里先給大家展示一下300萬數據查詢的效果:

 我們模糊查詢一下看看 ,body字段里面存儲的是文章,都是幾千字以的,現在查詢body中帶有"信號燈"的數據

 看效果

 

 

 

這里補充一點,執行索引后在更改xml配置,下次重新執行索引是需重啟tomcat

 qq群: 424259523


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM