问题描述
你好,汤姆,
我希望能够根据查询 (在这种情况下为空间查询) 汇总字数 (对于UI中的WordCloud控件)。
我有一张这样的表
该表在文本列上有一个全文索引 (上下文),以及一个空间索引。
数据库12.2,索引处于 “实时模式”。
我希望做的是利用上下文索引的令牌表 (D R$ ITEMS_NAME_IDX $ <?> 在这样的连接中提供字数,而不是滚动我自己的字符串分离器等。
这样的事情可能吗?或者我应该继续编写一个将字符串拆分到表的函数?
我还注意到有一个Blob列存储令牌信息,也许有一种方法可以根据我的需要从其中获取数据?
谢谢你的帮助
我希望能够根据查询 (在这种情况下为空间查询) 汇总字数 (对于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中引入横向使这变得更容易:
当然,这将找到所有的单词。Oracle文本的一个优点是您可以使用停止列表来排除常用词 (as,and,of等)。
但是同样,您实际上并不需要创建文本索引来执行此操作。您可以将想要标记化的字符串传递给ctx_doc.policy_tokens。这将字符串分成单词。
然后,您需要做的就是汇总结果:
有些在默认的停止列表中。所以它不再包含在输出中。
使用标准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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。