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
-
- 怎樣獲取資料?(查詢語句、url等等)
- 要讀什麼樣的資料(關係資料庫中的列、或者xml的域)
- 做什麼樣的處理(修改/新增/刪除)
跟關係資料庫一起使用
下面幾個步驟是必要的.
- 定義一個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 : 當遇到一些增量的輸入,或者發生一些變化時使用` 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上建立了一個數據庫. 好,現在開始了, 跟著下面的步驟走:
-
下載 example-solr-home.jar 並使用 jar解壓 jar -xvf example-solr-home.jar ,解壓到你的本地系統. 這個jar檔案包含了一個完整的solrhome(裡面的配置檔案很齊全了)和一個RSS的例子。它也包含了一個hssqldb資料庫的例子.
-
在 example-solr-home目錄, 這裡有一個 solr.war. 拷貝 這個 war 檔案到你的 tomcat/jetty webapps 資料夾. 這個 war file 也包含了hsqldb的JDBC driver. 如果你想在你已經有了的solr專案中部署,你只需要將 'dataimport.jar' 拷貝到 你的solr專案的 WEB-INF/lib 目錄下。
-
使用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