又兩天沒寫博客,關于SOLR的東西,寫了一周了還沒寫完我也是醉了,畢竟會的東西真不多,周四晚上加班沒寫,周五晚上公司同事聚會也沒寫,今天在家,還是把最后的一點寫完吧,我會的剩下的也就是一個對多個表創建索引了,表可以是關聯的,也可以是不關聯的,下面開始。
首先在數據庫創建一張表,本來有一個tuser表了,我又創建了一個role表,就兩三個字段,沒什么特殊的,然后在里面隨便添加幾條數據即可,看一下數據庫:
數據庫創建完成之后就是修改data-config.xml文件了,因為數據庫跟solr之間的關聯主要就是建立在這個文件上面的,所以接下來就是修改該文件了,我已經寫好了,下面直接貼出來看一下即可:
在<document></document>標簽中間在添加一個<entity>標簽即可,然后把對應的字段添加到中間就可以了,但是要注意幾點:
注意:
1.<entity>標簽的name屬性,該屬性用來區分不同的entity,所以不能和其他的entity標簽的name相同。
2.pk屬性,數據庫中表的主鍵是什么,那么pk屬性的值就是什么,不能改變。
3.第三點很重要,首先,我們再schema.xml中配置有這樣的屬性,這個配置代表著solr創建索引時對于id的值具有唯一性,就像數據庫表的主鍵一樣不能重復,在數據庫中主鍵重復會報錯,但是solr創建索引時,如果id的值重復,那么后面創建的索引會覆蓋前面創建的索引,我們平時創建表時主鍵id一般都是int類型自增的,這樣的話兩個表的id值很可能相同,那么就會發生索引覆蓋的情況。那么怎么解決呢?一個辦法是主鍵id使用uuid的方式,這樣肯定不會重復的,也就不會發生索引覆蓋的情況了。但是我們大多數情況下還是使用自增的方式作為id,我在網上查了下,有人直接在schema.xml中去掉uniqueKey屬性,也有在兩張表中新創建一個字段,將這個字段設置為uniqueKey屬性的值,以此來達到索引不覆蓋的目的,但是這兩種方式我都沒有嘗試過,大家有興趣的可以自己去嘗試一下。
4.在該文件中可以配置多個dataSource,也就是說如果你兩張表不在一個數據庫,那么你也可以同時對這兩張表創建索引,只需要將表和數據源對應上就可以了,方式如下:
將表中需要創建索引的字段添加到該文件中即可,注意,兩個表中相同的字段就可以不用再添加了,比如,兩個表中都有id,那么id字段只寫一次就可以了。
按照上面的方式配置完成之后,啟動tomcat,訪問localhost:8080/solr頁面,重新創建索引,創建完的索引如下所示:
{ "responseHeader": { "status": 0, "QTime": 1, "params": { "indent": "true", "q": "*:*", "_": "1445664391222", "wt": "json" } }, "response": { "numFound": 8, "start": 0, "docs": [ { "userAge": 33, "userAddress": "中國", "isdelete": 0, "updateTime": "2015-10-19T12:41:09Z", "id": 43, "userName": "劉德華", "_version_": 1515741213715595300 }, { "userAge": 44, "userAddress": "中國", "isdelete": 0, "updateTime": "2015-10-19T12:41:26Z", "id": 44, "userName": "周星馳", "_version_": 1515741214565990400 }, { "userAge": 55, "userAddress": "中國", "isdelete": 0, "updateTime": "2015-10-19T12:41:44Z", "id": 45, "userName": "劉若英", "_version_": 1515741214565990400 }, { "userAge": 123, "userAddress": "123", "isdelete": 0, "updateTime": "2015-10-19T12:51:30Z", "id": 46, "userName": "周潤發", "_version_": 1515741214565990400 }, { "userAge": 456, "userAddress": "456", "isdelete": 0, "updateTime": "2015-10-19T12:51:40Z", "id": 47, "userName": "梁朝偉", "_version_": 1515741214565990400 }, { "id": 1, "RoleDiscrib": "我是老大", "RoleName": "管理員", "_version_": 1515741214598496300 }, { "id": 2, "RoleDiscrib": "我是老大1", "RoleName": "管理員1", "_version_": 1515741214598496300 }, { "id": 3, "RoleDiscrib": "我是老大12", "RoleName": "管理員12", "_version_": 1515741214598496300 } ] }}
我數據庫中兩個表一共只有8條數據,創建的索引也是8條,關于id的事,只要兩個表中的id不重復,那么就不會發生索引覆蓋的事,所以我這里只是簡單做一個例子,關于索引覆蓋的事大家可以按照我上面說的幾種方法操作就可以了,當然有更好的方法更好了。
至于關聯表創建索引和單表創建索引差不多,本來我是想單獨創建幾個表,然后再一點一點寫出來,但是突然想起來前兩天有個朋友給我評論說我寫的東西完全看不明白,所以我想這次試試直接使用官方提供的例子來寫,什么意思呢?就是把官方文檔上的內容粘貼過來試試,其實官方文檔寫的更好。
<dataConfig><dataSource driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:/temp/example/ex" user="sa" /> <document name="
除了上面那種方式,官方文檔還給出了另外一種方式,但是這種方式我沒用過,下面我把那種方式貼出來,也把官方文檔的解釋貼出來,大家可以自己看著使用吧,不過我還是喜歡使用上面的這種方式:

<dataConfig> <dataSource driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:/temp/example/ex" user="sa" /> <document> <entity name="item" query="select * from item"> <entity name="feature" query="select description as features from feature where item_id='${item.ID}'"/> <entity name="item_category" query="select CATEGORY_ID from item_category where item_id='${item.ID}'"> <entity name="category" query="select description as cat from category where id = '${item_category.CATEGORY_ID}'"/> </entity> </entity> </document></dataConfig>官方的解釋是這樣的:
In the above example, there are mappings of fields to Solr fields. It is possible to totally avoid the field entries in entities if the names of the fields are same (case does not matter) as those in Solr schema. You may need to add a field entry if any of the built-in Tranformers are used (see Transformer section)
接下來還是修改schema.xml文檔,把需要創建索引的字段放到該文件中即可。
多表創建索引的方式我就介紹完了,雖然寫的很粗糙,但是應該還有點用吧,更多的內容大家可以自己去查看官方文檔的http://wiki.apache.org/solr/DataImportHandler這個地方,至于有人說都是英文看不懂,關于這個問題我想說的是其實我英文也是半吊子,但是借助一些翻譯工具還是能看一點的,看的多了就看的懂了,不要怕看英文,堅持看下去總能看的懂的,就算你看不全懂,至少能明白大概說的什么意思就行啊,帶蒙帶猜的,這都不是事。
另外關于solr的其他東西我就暫時不不寫了,一方面是因為我研究這個時間也不長,有些東西我也不是太懂,目前只能算是剛剛入門吧,另一方面,本來要用solr的項目又說不用了,新開的項目也是比較緊急,所以關于solr的東西也只好暫時先放下了,以后再用到的時候再撿起來繼續吧。恩,暫時就這樣了。
新聞熱點
疑難解答