sole(3) 配置Mysql數據導入


 MySql數據導入

大多數的應用程序將數據存儲在關係數據庫、xml文件中。對這樣的數據進行搜索是很常見的應用。所謂的DataImportHandler提供一種可配置的方式向solr導入數據,可以一次全部導入,也可以增量導入。

他可以實現

能夠讀取關係數據庫中的數據。
通過可配置的方式,能夠將數據庫中多列、多表的數據生成solr文檔
能夠通過solr文檔更新solr
提供通過配置文件就能夠導入所有數據的能力
能夠發現並處理 由insert、update帶來的變化(我們假定在表中有一個叫做“last-modified的列”)
能夠配置"完全導入"和"增量導入"的時間
讓讀取xml文件,並建立索引成爲可配置。
能夠將 其他的數據源(例如:ftp,scp,etc)或者其他格式的文檔(Json,csv)以插件的形式集成到項目中。


這個 Handler首先要在solrconfig.xml文件中配置下,如下所示。

  1. <requestHandlername="/dataimport"class="org.apache.solr.handler.dataimport.DataImportHandler">
  2. <lstname="defaults">
  3. <strname="config">/home/username/data-config.xml</str>
  4. </lst>

</requestHandler>

 

從它的名字上,我們或許也可以猜到,
DataImportHandler正是requestHandler的實現。我們一共需要在兩個地方配置文件中進行一些配置。
solrconfig.xml 。 data-config.xml必須在這個文件中配置,datasource也可以。不過,一般將datasource放在data- config.xml文件中。

下面幾個步驟是必要的.
1.定義一個data-config.xml 文件,並這個它的路徑配置到solrconfig.xml中關於DataImportHandler的配置中。給出Connection的信息(假設你選擇在solrconfig中配置datasource)

  1. <dataConfig> 
      <dataSource type="JdbcDataSource"  name="documentfirst"
       driver="com.mysql.jdbc.Driver" 
       url="jdbc:mysql://localhost:3306/test" 
       user="root" 
       password="root" 
       />  
  2.  <dataSource type="JdbcDataSource"  name="documentsecond"
       driver="com.mysql.jdbc.Driver" 
       url="jdbc:mysql://localhost:3306/eshopping" 
       user="root" 
       password="root" 
       />
     
    然後這樣使用 :
  1.  <document  > 
            <entity name="documents"  dataSource="documentfirst"
              query="select id,title,content,date_added from documents" 
              deltaImportQuery="select  id,title,content,date_added  from documents where ID='${dataimporter.delta.id}'" 
              deltaQuery="select id  from documents where date_added > '${dataimporter.last_index_time}'" 
              deletedPkQuery="select id  from documents where id=0"> 
                <field column="id" name="id" /> 
                <field column="title" name="title" /> 
                <field column="content" name="content" /> 
                <field column="date_added" name="date_added" /> 
            </entity> 
            <entity name="employee"  dataSource="documentsecond"
              query="select id,address,birthday,cardno from idcard" 
              deltaImportQuery="select id,address,birthday,cardno  from idcard where ID='${dataimporter.delta.id}'" 
              deltaQuery="select id  from idcard where date_added > '${dataimporter.last_index_time}'" 
              deletedPkQuery="select id  from idcard where id=0"> 
                <field column="id" name="id" /> 
                <field column="address" name="address" /> 
                <field column="birthday" name="birthday" /> 
                <field column="cardno" name="cardno" /> 
            </entity> 
      </document>  
  2. 配置完數據源(多數據源配置中,"name"屬性作爲唯一標識,必須保證唯一性)後,需要在schema.xml總配置是分詞與保存,參考代碼如下:
  3. <field name="id" type="string" indexed="true" stored="true" required="true" /> 
    <field name="title" type="text" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true"/> 
    <field name="content" type="text" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true"/> 
    <field name="date_added" type="date" indexed="false" stored="true"/> 
    <field name="text" type="text_general" stored="false" indexed="true"  multiValued="true"/>

    <defaultSearchField>text</defaultSearchField>
      <copyField source="title" dest="text"/> 
      <copyField source="content" dest="text"/>
     
    <field name="id" type="string" indexed="true" stored="true" required="true" /> 
    <field name="address" type="string" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true"/> 
    <field name="birthday" type="date" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true"/> 
    <field name="cardno" type="string" indexed="true" stored="true"/> 


    <defaultSearchField>text</defaultSearchField>
      <copyField source="address" dest="string"/> 
      <copyField source="birthday" dest="string"/> 
        <copyField source="cardno" dest="string"/>

一切準備就緒,打開DataImportHandler頁面去驗證,是否該配置的都配置好了。http://localhost:8080/solr/dataimport

2.1.使用“完全導入”命令將數據從數據庫中導出,並提交給solr建立索引

http://localhost:8080/solr/dataimport?command=full-import
2.2.使用“增量導入”命令對數據庫發生的變化的數據導出,並提交給solr建立索引。

http://localhost:8080/solr/dataimport?command=delta-import

PS詳細配置參數

配置JdbcDataSource

JdbcDataSource中的屬性有
  • driver(必需的):jdbc驅動名稱
  • url(必需的):jdbc鏈接
  • user:用戶名
  • password:密碼
  • 批量大小:jdbc鏈接中的批量大小

任何其他的在JdbcDataSource中配置的屬性,都會被直接傳給jdbc driver

配置data-config.xml

solr document是schema,它的域上的值可能來自於多個表.

data-config.xml的根元素是document。一個document元素代表了一種文檔。一個 document元素中包含了一個或者多個root實體。一個root實體包含着一些子實體,這些子實體能夠包含其他的實體。實體就是,關係數據庫上的表或者視圖。每個實體都能夠包含多個域,每個域對應着數據庫返回結果中的一列。域的名字跟列的名字默認是一樣的。如果一個列的名字跟solr field的名字不一樣,那麼屬性name就應該要給出。其他的需要的屬性在solrschema.xml文件中配置。

爲了能夠從數據庫中取得想要的數據,我們的設計支持標準sql規範。這使得用戶能夠使用他任何想要的sql語句。root實體是一箇中心表,使用它的列可以把表連接在一起。

 

dataconfig的結構

dataconfig的結構不是一成不變的,entity和field元素中的屬性是隨意的,這主要取決於processor和transformer。

以下是entity的默認屬性

  • name(必需的):name是唯一的,用以標識entity
  • processor:只有當datasource不是RDBMS時纔是必需的。默認值是SqlEntityProcessor
  • transformer:轉換器將會被應用到這個entity上,詳情請瀏覽transformer部分。
  • pk:entity的主鍵,它是可選的,但使用“增量導入”的時候是必需。它跟schema.xml中定義的uniqueKey沒有必然的聯繫,但它們可以相同。
  • rootEntity:默認情況下,document元素下就是根實體了,如果沒有根實體的話,直接在實體下面的實體將會被看做跟實體。對於根實體對應的數據庫中返回的數據的每一行,solr都將生成一個document。

一下是SqlEntityProcessor的屬性

  • query (required) :sql語句

  • deltaQuery : 只在“增量導入”中使用

  • parentDeltaQuery : 只在“增量導入”中使用

  • deletedPkQuery : 只在“增量導入”中使用

  • deltaImportQuery : (只在“增量導入”中使用) . 如果這個存在,那麼它將會在“增量導入”中導入phase時代替query產生作用。這裏有一個命名空間的用法${dataimporter.delta.}詳情請看solr1.4.

Commands

 

The handler 通過httprequest 向外界提供它的API . 以下是一些或許你會用到的操作

  • full-import : "完全導入"這個操作可以通過訪問URL http://:/solr/dataimport?command=full-import 完成。

    • 這個操作,將會新起一個線程。response中的attribute屬性將會顯示busy。

    • 這個操作執行的時間取決於數據集的大小。

    • 當這個操作運行完了以後,它將在conf/dataimport.properties這個文件中記錄下這個操作的開始時間

    • 當“增量導入”被執行時,stored timestamp這個時間戳將會被用到

    • solr的查詢在“完全導入”時,不是阻塞的

    • 它還有下面一些參數:

      • clean : (default 'true'). 決定在建立索引之前,刪除以前的索引。

      • commit: (default 'true'). 決定這個操作之後是否要commit

      • optimize: (default 'true'). 決定這個操作之後是否要優化。

      • debug : (default false). 工作在debug模式下。詳情請看 the interactive development mode (see here)

  • delta-import : 當遇到一些增量的輸入,或者發生一些變化時使用`DataImport - 航夢 - 火星?地球? http://:/solr/dataimport?command=delta-import . 它同樣支持 clean, commit, optimize and debug 這幾個參數.

  • status : 想要知道命令執行的狀態 , 訪問 URL http://:/solr/dataimport .它給出了關於文檔創建、刪除,查詢、結果獲取等等的詳細狀況。

  • reload-config : 如果data-config.xml已經改變,你不希望重啓solr,而要重新加載配置時,運行一下的命令http://:/solr/dataimport?command=reload-config

  • abort : 你可以通過訪問 url http://:/solr/dataimport?command=abort 來終止一個在運行的操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章