我有一個我需要搜索的單詞串列(比如幾千個不超過 30 個字符的 varchar2 條目),我需要在句子中搜索這些單詞的存在(比如大約一億個 varchar2 條目超過 256 個字符)。我想獲得至少一個單詞匹配的文本的 id,理想情況下是一個索引串列,給出搜索單詞的位置。
| ID | 搜索詞 |
|---|---|
| 1 | 冥王星 |
| 2 | 木星 |
| ID | 句子 |
|---|---|
| 1 | 我們回到地球 |
| 2 | 我們發現冥王星和木星 |
會回傳結果
| 最低結果 |
|---|
| 2 |
| 理想的結果 |
|---|
| 2, ( (1, 13), (2, 23)) |
雖然這是可以開發的東西,但感覺就像是一個常見的 SQL 請求。因此,我想知道是否有最佳實踐,或者如果從 19c 或 PL/SQL 開始的 oracle SQL 中有一個專用函式可以有效地做這樣的事情,是否有更好的做法。似乎 Oracle Text CONTAINSandACCUMulate可以作業,但我不確定我是否可以在我的背景關系中使用 Oracle Text,以及這通常會比純 SQL PL/SQL 請求慢還是快。
uj5u.com熱心網友回復:
我對性能沒有任何要求,并且在經過審查并考慮負載/性能影響之前,我不會在生產環境中運行它。
- 我使用 2 個 CTE 來模擬您的資料(SearchWords and Sentences)
- 我
instr()用來查找每個單詞在句子中的位置 - 我
listAgg()習慣將句子中每個單詞的資料組合成一行。 - 我只回傳在句子中找到單詞的情況
- 我使用
CROSS JOIN與每個句子相關的每個搜索詞(這可能會在記憶體使用 CPU 等方面變得丑陋,因為資料集將是巨大的)數千個詞乘以數億個句子......
使用文本搜索可能會更好地完成此操作,但我不確定如何以這種方式獲得您正在尋找的資料格式...聳聳肩,如果這是一次性的事情并且您有時間等待......并且它是在一個不會降低生產的環境中......
演示: https ://dbfiddle.uk/?rdbms=oracle_21&fiddle=77e0b8d9373ee1abc14cf10342c45767
with SearchWords as (SELECT 1 ID , 'pluto' SearchWord from dual UNION ALL
SELECT 2, 'jupiter' from dual),
Sentences as (SELECT 1 ID, 'we go bacvk to earth' sentence from dual UNION ALL
SELECT 2, 'we discover pluto and jupiter' from dual),
Step1 as (SELECT S.ID, LISTAGG('(' || W.ID || ',' || instr(S.Sentence,W.SearchWord) || ')', ',')
WITHIN GROUP (ORDER BY W.ID) Result
FROM Sentences S
CROSS JOIN SearchWords W
WHERE instr(S.Sentence,W.SearchWord)>0
GROUP BY S.ID)
SELECT * FROM Step1
真的不需要 step1 CTE ......但我不確定它是否會在大門外作業。
給我們:
---- ---------------
| ID | RESULT |
---- ---------------
| 2 | (1,13),(2,23) |
---- ---------------
如果需要:您可以將句子細分為處理組以處理一些然后合并更多等...以管理命中。但是,如果您的環境足夠大,它可能能夠一口氣處理它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/426886.html
