使用Apache Solr對資料庫建立索引(包括處理CLOB、CLOB)(轉)

必須) 辨識檔案的正規表達式
•
baseDir : (必須) 根目錄(虛拟路徑)
•
recursive : 是否要遞歸的擷取檔案,預設是false。
•
excludes : 比對檔案名的正規表達式
•
newerThan : 一個數字參數 . 使用格式 (yyyy-MM-dd HH:mm:ss) . 它可以是一個datemath 類型的字元串,例如:('NOW-3DAYS'). 需要加單引号。它也可以是一個變量,像${var.name}這樣。
•
olderThan : 一個數字參數 . 跟上一條的規則是一樣的
•
rootEntity :根實體的值必須是false,除非你想索引檔案名。位置直接在下面的是根實體,這就意味着根實體産生的行都将被當成一個document存放在lucene裡面。但是,在這個例子裡面,我們并不想為每個檔案建立一個 document,我們想對x實體産生的行建立document,因為實體f的屬性rootEntiry等于false,是以在直接位于實體f下面的實體将成為根實體,它所産生的行将會被當成一個document。
•
dataSource :它必須被設為null值,因為這裡并不需要使用任何的資料源,即是說,我們将不會建立Datasource的執行個體。(在大多數的情況下,隻有一個資料源,jdbc資料源,所有的實體都用,在這裡,資料源是沒有必要的。)
例子:
千萬要注意rootEntiry這個屬性,由這個處理器所産生的域有fileAbsolutePath,fileSize,fileLastModified,fileName.
CachedSqlEntityProcessor
應該說,這是SqlEntityProcessor的一個擴充,這個處理器通過緩存一些行,來減少資料庫查詢。它幾乎對根實體沒有用,因為這個實體中隻有一個sql語句被執行了。
Example 1.
這個例子的用法跟下面的是一樣的,一個查詢被執行完,它的結果被存儲起來,下次這個查詢再被執行的的時候,它将會從緩存中取出結果并傳回。
Example 2:
這個例子跟前一個的差別在于屬性‘where’。這個例子中,查詢語句将從表中取回所有的資料,并把他們都放在緩存中。其中的關鍵就在域 屬性‘where’。緩存使用y中的xid作為鍵值,實體被查詢的時候x.id的值就會被計算出來,我們首先會在緩存中找比對的資料,接着傳回。
在屬性where中,=号之前的值是y中的列,=号之後的值是計算出來的要在緩存中查找的值。
DataSource(資料源)
org.apache.solr.handler.dataimport.DataSource 能被繼承。
public abstract class DataSource {
public abstract void init(Context context, Properties initProps);
public abstract T getData(String query);
public abstract void close();
}
它必須在資料源的定義部分被配置。
JdbcdataSource
這個是預設的,它的聲明如下:
public class JdbcDataSource extends DataSource >>
它可以一條一條的周遊資料庫,每一行資料被當作一個Map。
HttpDataSource
XPathEntityProcessor使用這個資料源 . 它的聲明如下:
public class HttpDataSource extends DataSource
FileDataSource
這個很像HttpDataSource . 它的聲明如下:
public class FileDataSource extends DataSource
The attributes are:
•
basePath: (可選的) ,得到所需要的值時必須的基本路徑。
•
encoding: (可選的)當檔案編碼跟平台編碼不一樣的時候,應當設定這個值。
Boosting , Skipping documents(提高文檔的得分,或者跳過文檔)
我們還可以在運作的時候提高一個文檔的得分,或者跳過某一個特定的文檔。
可以通過自定義轉化器,增加一個屬性,并将它設為true,這樣就可以跳過這個文檔了。可以通過,增加一個屬性docBoost ,屬性是文檔的評分的這種方式給文檔打分。Write a custom Transformer to add a value $skipDocwith a value 'true' to skip that document. To boost a document with a given value add $docBoost with the boost value
在 solrconfig.xml中增加資料源
我們也可以在solrconfig.xml中配置資料源,屬性是一樣的,隻是方式稍微有點不同。
/home/username/data-config.xml
com.mysql.jdbc.Driver
jdbc:mysql://localhost/dbname
db_username
db_password
結構圖
下面的這個圖顯示了一般的配置檔案的邏輯流程。
DataImport - 航夢 - 火星?地球?
上面的這個圖表達了這樣的一個意思:一共有三個資料源,兩個關系資料庫的資料源,和一個http/xml的資料源。
jdbc1 和jdbc2 是JdbcDataSource ,它配置在solrconfig.xml檔案中。
•
http是一個HttpDataSource類型的資料源。
•
根實體是一個叫做a的表,它使用jdbc1作為它的資料源。實體一般都與表名相同。
•
實體A有兩個子實體 B 和C 。B使用http資料源,C使用jdbc2資料源。
•
在執行一個full-import的指令的時候,根實體A會首先被執行。
•
由實體A導出的每一行,都會被傳給實體B和實體C。
•
B和C通過占位符來使用實體A中的資料。占位符:${A.a}。
◦
B 有一個url屬性
◦
C 有一個query屬性
•
C 有兩個轉換器 ‘f’和‘g’。
•
由C産生的每一行資料,都會被有序的傳給 'f '和‘g’(轉換器是鍊式的,即有序的)。每個轉換器都能夠改變輸入的值。在這裡轉換器‘g’将從一行資料(f(c .1))中産生兩行資料。
•
最近将每個實體的結果合并成為一個文檔。
◦
請注意:從C産生的中間結果,例如C.1 c.2 ,f(c.1) f(c.2),都将被忽略掉。
域聲明
域的聲明,能夠幫助我們通過提供一些額外的資訊得到那些不能自動擷取到的值。它依賴于結果集中的列。在dataConfig裡面配置的域,一般情況下應該跟schema配置的一樣。它應該自動繼承schema.xml中的所有的域。但是,你不能增加一些額外的域。 那麼,什麼時候增加域聲明呢?
•
當實體處理器所産生的域的名字,跟相應的域在schema.xml中的名字不一樣的時候。
•
當内嵌的轉換器需要一些額外的資訊來決定哪個域要處理,以及該怎麼處理的時候。
•
XPathEntityprocessor 或者其他的處理器,顯示的要求一些額外的資訊的時候。
關于行(row)和多值域
行在DataimportHandler中的表現形式是一個Map。在這個map裡面,key是域的名字,value可以任何一個合法的solr 類型。value也能夠是合法的solr類型的聚集(這将會映射到一個多值域)。如果資料源是RDBMS的話,一般是不會産生多值域的。當然我們可以通過加一個子實體的方式來産生多值域。這裡子實體傳回的多個域,相當于父實體的一個多值域。如果資料源是xml的話,産生多值域是一件相當簡單的事情。
變量
變量是指最終代替那些占位符的值。這是一個多級的map,每一個命名空間都是一個map,命名空間使用.分隔。例如 占位符 ${item.ID}, 'item'是一個命名空間(也是一個map),ID是這個命名空間下的一個值。我們很容易推導出 占位符 ${item.x.ID} 這裡x是另外一個map。變量的值能夠從Context中獲得,也可以在RDMS的query屬性中或者http資料源的url屬性中使用類似${}的占位符獲得。
使用函數來自定義query和url的格式
命名空間這個概念在這裡也是相當的有用的。使用者可能想要傳一個經過計算的值給 query或者url,比如這裡有一個Data類型的資料,但是你的資料源隻支援另外一種格式的資料源。我們提供了一些函數,或許它們能夠幫你完成一些事情。
•
formatDate : 它可以像這樣去使用,'${dataimporter.functions.formatDate(item.ID, yyyy-MM-dd HH:mm)}' 。它的第一個參數是一個合法的變量,第二個參數是一種時間格式(這裡使用的格式工具是SimpledateFormat),The first argument can be a valid value from the VariableResolver and the second cvalue can be a a format string (use SimpledateFormat) . 它可以是一個經過計算的值,它使用solr的時間表示方式。(要注意,它必須被單引号括起來
•
escapeSql : 使用它可以對特别的sql 字元串進行包裝。例子 :'${dataimporter.functions.escapeSql(item.ID)}'. 這裡隻使用一個參數,這個參數必須是一個合法的VaraiableResolver.
•
encodeUrl : 使用這個對url進行編碼。例子e: '${dataimporter.functions.encodeUrl(item.ID)}' . 隻使用一個參數,這個參數必須是一個合法的VariableResolver
通路請求參數
我們可以使用'request'命名空間來通路傳遞給http 請求的參數。例如'${dataimporter.request.command}' 将會傳回被執行的指令。任何參數都可以通過這種方式得到。
互動式的開發模式Interactive Development Mode
這是一個很酷的,并且功能強大的工具。它能夠幫助你通過圖形界面來建立一個dataconfig.xml文檔。你可以通過DataImport - 航夢 - 火星?地球? http://host:port/solr/admin/dataimport.jsp 來通路它。 以下是它的特性:
•
這個界面有兩個闆塊,RHS是用來擷取輸入的,LHS是用來顯示輸出的。
•
當你點選debug now 按鈕的時候,它将會執行配置檔案,并且顯示結果文檔。
•
你可以通過start和rows這兩個參數來調試 類似從115開始到118這樣的文檔。
•
選擇 'verbose'選項表示你想要得到一些關于中間步驟的資訊。包括query産生的資料,傳給轉換器的資料,以及轉換器産生的資料。
•
如果在運作過程中發生了異常,那麼LHS闆塊将顯示異常資訊。
•
fields是由實體産生的。當域沒有在schema.xml中聲明,也沒有在dataConfig.xml有聲明的時候,轉換器就不會對該域進行處理了。
螢幕快照
DataImport - 航夢 - 火星?地球?
哪裡可以找到它?
DataimportHandler是solr的新加的特性。
•
從 DataImport - 航夢 - 火星?地球? Solr website 下載下傳一個最新的版本 。
•
通過 Full Import 的例子來感受一下。
在Solr JIRA.的 DataImport - 航夢 - 火星?地球? SOLR-469 你可以檢視到有關DataImporthandler的一些開發讨論。
第三部分:SOLR的db-data-config.xml進階進階(處理CLOB和BLOB)
我們在使用solr處理資料庫時,很多時候需要處理一下資料庫中的CLOB、BLOB字段,對于這兩種字段如何處理,下面以代碼的形式給大家示範,(不用寫Java代碼啊)
1)定義資料源
Code-java代碼 收藏代碼
1."ora" driver="oracle.jdbc.OracleDriver" url="...." />
2."ds-BlobField" type="FieldStreamDataSource" />
2.)寫一個blob字段處理
Code-java代碼 收藏代碼
1."ora" name="meta" query="select id, filename,content, bytes from documents" transformer="ClobTransformer">
2. "ID" name="id" />
3. "FILENAME" name="filename" />
4.
dataField="ATTACH.FILE_CONTENT">
這裡簡單介紹一下,上述藍色字型是處理clob必須的,紅色字型是處理blob必須的。
還是比較簡單的吧。如果你還沒看明白,,我也沒轍了。哦,這裡需要說明一下,使用上述代碼需要依賴幾個jar包:
tika-app-0.9.jar(巨大20M,不過非常好用,對于PDF、Excel、Word、PPT、RTF、TAR 、ZIP 等等吧,好多自己查吧。)
http://apache.etoak.com//pdfbox/1.6.0/pdfbox-app-1.6.0.jar
activation-1.1.jar
mail-1.4.1.jar
缺少了就跑不起來了,;)
http://www.blogjava.net/conans/articles/379546.html
分享到:
2013-06-21 18:53
浏覽 1049
評論