假設我們有一個包含各種數據字段的實體Foo
,其中一個爲List<Bar>
。反過來,酒吧有各種數據字段,其中一個是List<Snafu>
。我們希望爲用戶提供一個輸入字段,以便他們對持久化Foo記錄進行通用搜索。例如,他們搜索test
,並且將找到一個Foo記錄,該記錄具有一個帶有包含字符串「test」的數據字段的Snafu的Bar。對持久化JPA實體執行通用搜索
是否有可能有效地進行這種搜索,或是否需要不同的技術(例如Lucene)?
假設我們有一個包含各種數據字段的實體Foo
,其中一個爲List<Bar>
。反過來,酒吧有各種數據字段,其中一個是List<Snafu>
。我們希望爲用戶提供一個輸入字段,以便他們對持久化Foo記錄進行通用搜索。例如,他們搜索test
,並且將找到一個Foo記錄,該記錄具有一個帶有包含字符串「test」的數據字段的Snafu的Bar。對持久化JPA實體執行通用搜索
是否有可能有效地進行這種搜索,或是否需要不同的技術(例如Lucene)?
是的,你應該看看使用lucene。
hibernate搜索庫(由lucene支持)很容易在你的實體上使用註釋來啓動和運行,並且非常簡單地適用於hibernate項目。
如果這是足以讓你只需找出引用Foo
,你可以創建一個包含所有被引用的表記錄的數據庫視圖。爲這樣的視圖編寫SQL將非常簡單。
否則,你可以看看Lucene(就像rhinds指出的那樣),但這意味着你將不得不在其他地方複製數據庫數據。另一方面,搜索會更加強大(例如,與DB不同,Lucene可以輕鬆處理拼寫錯誤)。
你能提供一個更正式的* generic * search的定義嗎?你給出的例子只建議表連接('Foo' - >'Bar' - >'Snafu')。 – mindas 2013-04-23 09:07:50
那麼如何在Foo,Bar和Snafu中搜索「測試」一詞的所有數據字段? – theblang 2013-04-23 14:28:48
http://sqlfiddle.com/#!2/070b3b/2 - 只是粗略的想法。但我的觀點是,你應該首先定義你想要的。在DB中搜索與在Lucene中搜索完全不同。 – mindas 2013-04-23 15:19:40