1. 程式人生 > >Solr對資料庫建立索引

Solr對資料庫建立索引

以下資料整理自網路,以及檢視solr幫助文件。主要分為兩部分,第一部分是對《db-data-config.xml》的配置內容的講解(屬於高階內容),第二部分是DataImportHandler(屬於基礎),第三部分是對db-data-config.xml的進階

第一部分是對《db-data-config.xml》

query是獲取全部資料的SQL
deltaImportQuery是獲取增量資料時使用的SQL
deltaQuery是獲取pk的SQL
parentDeltaQuery是獲取父Entity的pk的SQL

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

限制
子Entity的query必須引用父Entity的pk
子Entity的parentDeltaQuery必須引用自己的pk
子Entity的parentDeltaQuery必須返回父Entity的pk
deltaImportQuery引用的必須是自己的pk

第二部分是DataImportHandler

關於DataImportHandler的具體使用方法,詳見下文,如果你英文超級好,那看這個連結吧:http://wiki.apache.org/solr/DataImportHandler

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

      概覽

         目

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

          設計思路

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

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">/home/username/data-config.xml</str>      
    </lst>
  </requestHandler>

從它的名字上,我們或許也可以猜到,
DataImportHandler正是requestHandler的實現。我們一共需要在兩個地方配置檔案中進行一些配置。

  • solrconfig.xml 。 data-config.xml必須在這個檔案中配置,datasource也可以。不過,一般將datasource放在data-config.xml檔案中。
  • data-config.xml
  1.  
    1.    怎樣獲取資料?(查詢語句、url等等)
    2.   要讀什麼樣的資料(關係資料庫中的列、或者xml的域)
    3.    做什麼樣的處理(修改/新增/刪除)

      跟關係資料庫一起使用

下面幾個步驟是必要的.

  •      定義一個data-config.xml 檔案,並這個它的路徑配置到solrconfig.xml 中關於DataImportHandler的配置中。
  •       給出Connection的資訊(假設你選擇在solrconfig中配置datasource)
  • 使用“完全匯入”命令將資料從資料庫中匯出,並提交給solr建立索引
  • 使用“增量匯入”命令對資料庫發生的變化的資料匯出,並提交給solr建立索引。

           配置資料來源

將dataSource標籤直接新增到dataConfig下面,即成為dataConfig的子元素.

<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/dbname" user="db_username" password="db_password"/>

資料來源也可以配置在solrconfig.xml中

  • 屬性type 指定了實現的型別。它是可選的。預設的實現是JdbcDataSource。
  • 屬性 name  是datasources的名字,當有多個datasources時,可以使用name屬性加以區分
  • 其他的屬性都是隨意的,根據你使用的DataSource實現而定。
  • 當然 你也可以實現自己的DataSource。
  •           多資料

         一個配置檔案可以配置多個數據源。增加一個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>

..
複製程式碼
配置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 來終止一個在執行的操作

Full Import 例子

This is a relational model of the same schema that Solr currently ships with. 我們使用這個例子來為我們的DataImportHandler建data-config.xml。 我們已經使用這個結構在HSQLDB上建立了一個數據庫. 好,現在開始了, 跟著下面的步驟走: 

  1. 下載 example-solr-home.jar 並使用 jar解壓  jar -xvf example-solr-home.jar ,解壓到你的本地系統. 這個jar檔案包含了一個完整的solrhome(裡面的配置檔案很齊全了)和一個RSS的例子。它也包含了一個hssqldb資料庫的例子.

  2. 在 example-solr-home目錄, 這裡有一個 solr.war. 拷貝 這個 war 檔案到你的 tomcat/jetty webapps 資料夾.  這個 war file 也包含了hsqldb的JDBC driver. 如果你想在你已經有了的solr專案中部署,你只需要將  'dataimport.jar' 拷貝到 你的solr專案的 WEB-INF/lib 目錄下。

  3. 使用example-data-config目錄下的solr目錄作為你solrhome

上面給出的solr目錄是一個多核的solr home。它有兩個核,一個是DB example,一個是RSSexample(新屬性)。

這個例子的data-config.xml 如下:

複製程式碼
<dataConfig>

<dataSource driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:/temp/example/ex" user="sa" />

    <document name="products">

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

            <field column="ID" name="id" />

            <field column="NAME" name="name" />

            <field column="MANU" name="manu" />

            <field column="WEIGHT" name="weight" />

            <field column="PRICE" name="price" />

            <field column="POPULARITY" name="popularity" />

            <field column="INSTOCK" name="inStock" />

            <field column="INCLUDES" name="includes" />



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

                <field name="features" column="description" />

            </entity>

            <entity name="item_category" query="select CATEGORY_ID from item_category where item_id='${item.ID}'">

                <entity name="category" query="select description from category where id = '${item_category.CATEGORY_ID}'">

                    <field column="description" name="cat" />

                </entity>

            </entity>

        </entity>

    </document>

</dataConfig>
複製程式碼

這裡, 根實體是一個名叫“item”的表,它的主鍵是id。我們使用語句 "select * from item"讀取資料. 每一項都擁有多個特性。看下面feature實體的查詢語句

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

       <field name="feature" column="description" />

   </entity> 

feature表中的外來鍵item_id跟item中的主鍵連在一起從資料庫中取得該row的資料。相同地,我們將item和category連表(它們是多對多的關係)。注意,我們是怎樣使用中間表和標準sql連表的

<entity name="item_category" query="select category_id from item_category where item_id='${item.id}'">
                <entity name="category" query="select description from category where id = '${item_category.category_id}'">
                    <field column="description" name="cat" />
                </entity>
            </entity>

短一點的 data-config

在上面的例子中,這裡有好幾個從域到solr域之間的對映。如果域的名字和solr中域的名字是一樣的話,完全避免使用在實體中配置域也是可以的。當然,如果你需要使用轉換器的話,你還是需要加上域實體的。

相關推薦

Solr資料庫建立索引

以下資料整理自網路,以及檢視solr幫助文件。主要分為兩部分,第一部分是對《db-data-config.xml》的配置內容的講解(屬於高階內容),第二部分是DataImportHandler(屬於基礎),第三部分是對db-data-config.xml的進階

Solr資料庫中的CLOB欄位建立索引的問題

對於oracl中的clob欄位,solr建立索引時,如果沒有作處理,否則會展示成這樣。 <content>[email protected]</content> 需

利用solr的 DataImportHandler從mysql資料庫建立索引

步驟1: 首先修改solrconfig.xml 加往上DataImportHandler的配置 <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> &

mysql資料庫建立索引和使用

1. 2               需要注意: ,後續新增修改索引。。需要注意索引需要的不同資料庫引擎 alter table user add fulltext(欄

oracle資料庫建立索引以及簡單優化sql語句

Oracle 建立索引及SQL優化 資料庫索引: 索引有單列索引 複合索引之說 如何某表的某個欄位有主鍵約束和唯一性約束,則Oracle 則會自動在相應的約束列上建議唯一索引。資料庫索引主要進行提高訪問速度。 建設原則:  1、索引應該經常建在Where 子句經常用到的列上。如

Lucene7.0與HanLP分詞器整合索引資料庫建立索引檔案

HanLP官網:http://hanlp.linrunsoft.com/ GitHup地址:https://github.com/hankcs/HanLP HanLP外掛地址:https://github.com/hankcs/hanlp-lucene-plugin 需要一下ja

資料庫建立索引的幾種方法

  1、普通索引      CREATE INDEX indexName ON mytable(username(length));      建立表的時候直接指定:  C

資料庫建立索引

一、為什麼建立索引,以及優缺點? 建立索引可以大大提高系統的效能 優點 通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性 可以大大加快資料的檢索速度,這也是建立索引的最主要的原因 可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。 在使

資料庫建立索引的注意事項

資料庫索引詳解 [By GavinHacker] 轉載請標明出處:http://www.cnblogs.com/gavinsp/p/5513536.html 關於資料庫索引,相信大家用到最多的一定是資料庫設計和資料庫查詢,本篇深度解析一下資料庫索引的原理,涉

面試題(一)- 談談你資料庫索引的理解

轉載自《http://www.cnblogs.com/newpanderking/p/3781043.html》 1、首先要明白無名無實莫要用索引:因為資料中的記錄很多,為了方便我們查詢,提高查詢的效率; 2、索引的原理:對要查詢的欄位建立索引其實就是把該欄位按照一定的

千萬級MySQL資料庫建立索引的事項及提高效能的手段

1.對查詢進行優化,應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應儘量避免在 where 子句中對欄位進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:select id from t where nu

oracle資料庫建立索引的原則

資料庫建立索引的原則 1,確定針對該表的操作是大量的查詢操作還是大量的增刪改操作。 2,嘗試建立索引來幫助特定的查詢。檢查自己的sql語句,為那些頻繁在where子句中出現的欄位建立索引。 3,嘗試建立複合索引來進一步提高系統性能。修改複合索引將消耗更長時間,同時,複合索引也佔磁碟空間。 4,對於小型的表,建

mysql資料庫和oracle資料庫建立索引的原則

資料庫建立索引的原則  1,確定針對該表的操作是大量的查詢操作還是大量的增刪改操作。  2,嘗試建立索引來幫助特定的查詢。檢查自己的sql語句,為那些頻繁在where子句中出現的欄位建立索引。  3,嘗試建立複合索引來進一步提高系統性能。修改複合索引將消耗更長時間,同時,複合

資料庫建立索引、資料表建立規則、備用欄位 / 保留欄位 / 預留欄位

資料庫建立索引 資料庫、資料表建立索引的原則 資料庫建立索引的原則 1,確定針對該表的操作是大量的查詢操作還是大量的增刪改操作。 2,嘗試建立索引來幫助特定的查詢。檢查自己的sql語句,為那些頻繁在where子句中出現的欄位建立索引。 3,嘗試建立複合索引來進一步提高系統性能。修改複合

資料庫建立索引的原則

鐵律一:天下沒有免費的午餐,使用索引是需要付出代價的。 索引的優點有目共睹,但是,卻很少有人關心過採用索引所需要付出的成本。若資料庫管理員能夠對索引所需要付出的代價有一個充分的認識,也就不會那麼隨意到處建立索引了。 仔細數數,其實建立索引的代價還是蠻大的。如建立索引和維護索

為mysql資料庫建立索引;mysql索引總結----mysql 索引型別以及建立;mysql_建立索引的優缺點

因為欣賞所以轉載: http://www.cnblogs.com/cy163/archive/2008/10/27/1320798.html http://www.cnblogs.com/lihuiyong/p/5623191.html ht

為mysql資料庫建立索引

前些時候,一位頗高階的程式設計師居然問我什麼叫做索引,令我感到十分的驚奇,我想這絕不會是滄海一粟,因為有成千上萬的開發者(可能大部分是使用MySQL的)都沒有受過有關資料庫的正規培訓,儘管他們都為客戶做過一些開發,但卻對如何為資料庫建立適當的索引所知較少,因此我起了寫一篇相關文章的念頭。   最普通的情況,

MSSQL無法檢視建立 索引,因為該檢視未繫結到架構

在建立檢視後建立索引 提示 無法對檢視建立 索引,因為該檢視未繫結到架構 修改此問題 需要在 建立檢視語句中加上 with SCHEMABINDING create View myView(id,code) with SCHEMABINDING as select id,c

資料庫建立索引的規則

資料庫適合建立索引的規則如下: 表的主鍵,外來鍵應該建立索引; 資料量比較大的表應該建立索引; 經常需要和其他表建立連線,在連線欄位應該建立索引; 經常出現在where子句中的欄位,應該建立索引。 資料庫不適合建立索引的情況: 比較大的文字欄位或者長度較長的欄位,不

Hive建立索引

效率 style 建立 compact 索引表 dex mina red eat 1.首先創建表 create table user(   id int,   name string,   address string ) ROW FORMAT DELIMITE