暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 通过加入索引行从上下文文本索引中获取字数

askTom 2017-10-16
303

问题描述

你好,汤姆,
我希望能够根据查询 (在这种情况下为空间查询) 汇总字数 (对于UI中的WordCloud控件)。

我有一张这样的表
create table items (id raw(16), text clob, geom sdo_geometry )
复制


该表在文本列上有一个全文索引 (上下文),以及一个空间索引。
数据库12.2,索引处于 “实时模式”。


我希望做的是利用上下文索引的令牌表 (D R$ ITEMS_NAME_IDX $ <?> 在这样的连接中提供字数,而不是滚动我自己的字符串分离器等。
select 
sum(token_count) as wordcount, 
TOKEN_TEXT as word
from DR$ITEMS_NAME_IDX$k a
inner join items b on a.textkey = b.rowid
inner join ??? 
where sdo_relate(b.geom,PARAM_GEOMETRY)='TRUE'
group by TOKEN_TEXT;
复制

这样的事情可能吗?或者我应该继续编写一个将字符串拆分到表的函数?

我还注意到有一个Blob列存储令牌信息,也许有一种方法可以根据我的需要从其中获取数据?

谢谢你的帮助

专家解答

嗯,你根本不需要使用Oracle文本索引来做到这一点!

使用标准SQL有各种单词到行的技术。例如,如果您有简单的单行距文本,则可以通过从文本本身减去空格的长度来找到单词数。并添加一个。

然后,您可以使用 “按级别连接” 行生成技巧将这些行转换为行并对其进行计数。在12c中引入横向使这变得更容易:

create table t (
  x varchar2(100)
);
insert into t values ('some text more text extra text some more text');
commit;
select 
  trim(regexp_substr(t.x, '[[:alpha:]]+', 1, words.l)) word,
  count(*)
from t,
     lateral (
       select level l from dual 
       connect by level <= length (t.x) - length(replace(t.x, ' ')) + 1 
     ) words
group by trim(regexp_substr(t.x, '[[:alpha:]]+', 1, words.l))
order by count(*) desc;

WORD    COUNT(*)   
text             4 
some             2 
more             2 
extra            1 
复制


当然,这将找到所有的单词。Oracle文本的一个优点是您可以使用停止列表来排除常用词 (as,and,of等)。

但是同样,您实际上并不需要创建文本索引来执行此操作。您可以将想要标记化的字符串传递给ctx_doc.policy_tokens。这将字符串分成单词。

然后,您需要做的就是汇总结果:

exec ctx_ddl.create_policy('mypolicy');
declare
  la     varchar2(200);
  rtab   ctx_doc.token_tab;
begin
   ctx_doc.policy_tokens('mypolicy', 
        'some text more text extra text some more text',rtab);
   for words in (
     select token, count(*) c from table(rtab)
     group  by token
     order  by count(*) desc
   ) loop
     dbms_output.put_line(words.token || ' count = ' || words.c);
   end loop;
end;
/

TEXT count = 4
MORE count = 2
EXTRA count = 1
复制


有些在默认的停止列表中。所以它不再包含在输出中。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论