我是SQL的新手,所以这个问题可能相当基本,但我花了很多时间没有成功。
我得到了一块我需要修改的SQL代码。该块当前从文本索引中提取所有标记(“单词”)。我需要做的是遍历每个令牌并(1)从中提取给定长度N
的所有字符N-gram,然后(2)将它们插入表中。
因此,如果令牌是abcdf
和N=3
,那么我需要提取abc
,bcd
和cdf
我正在努力(1)。
我在Oracle的PL / SQL中发布:版本11.2.0.3.0
我现在拥有的是:
CREATE OR REPLACE PROCEDURE extract_ngrams
AS
tokens ctx_doc.token_tab;
w VARCHAR2(255);
NgramLen NUMBER;
ngr VARCHAR(10);
BEGIN
-- extract all tokens ("words")
CTX_DOC.TOKENS(myindex,textkey,tokens);
NgramLen := 3;
FOR i IN tokens.FIRST..tokens.LAST LOOP
w := tokens(i).token;
dbms_output.put_line(w);
-- Use SUBSTRING + LEN or some other approach to extract Ngrams of length=NgramLen
-- insert each Ngram into a table
end loop;
END;
/
将FOR
循环与SUBSTRING
,LEN
和/或其他任何适当函数结合起来的正确方法是什么,以某种方式将ngrams提取到ngr
中类似于如何将标记提取到w
?
THX!
答案 0 :(得分:1)
这是你想要的一个例子:
FOR idx IN 1..(LENGTH(w)-NgramLen+1)
LOOP
-- do what you want here
DBMS_OUTPUT.PUT_LINE(SUBSTR(w,idx,NgramLen));
END LOOP;
并且不要忘记声明idx NUMBER;