![](/img/trans.png)
[英]How to connect to Oracle Database 12c HR schema from IntelliJ IDEA 14
[英]Oracle Database 12c: How to also get the result index from a contains search
我有一个Java服务,可以在Oracle 12c数据库上执行搜索。 问题是我有一个CONTAINS()
搜索:
String query = "select * from sys.my_table WHERE CONTAINS(my_clob_field, '" + searchString + "', 1) > 0";
但我也想得到结果中搜索词或短语的索引。
目前我尝试过的是获取每个返回的搜索结果并通过它们在Java中执行REGEX搜索,以找到在前端突出显示搜索结果所需的开始和停止索引。
这适用于常规文本,但如果要求用户可以搜索任何字符的任意随机排列 (即#<@(F#> <)$ *> /\\ ./#&!)#} {}] [ s fdf)Java搜索还需要找到确切的字符串并返回开始和停止索引。
我为Oracle搜索排除了任何特殊字符,但是Java搜索需要一组完全不同的规则才能找到索引。 试图让它们匹配已经证明是一场噩梦,通常Java REGEX搜索找不到Oracle数据库搜索找到的相同事件。 我相信我采取的方法是完全错误的,并且应该有一些简单的方法来获得hte搜索词(或短语)出现的索引。
TL; DR:当执行一个CONTAINS()
搜索,我怎么可能还发现仅使用Oracle数据库查询返回的搜索结果中的搜索词或短语的指标(所以我不担心失去搜索结果REGEX不匹配)?
也许您正在寻找像REGEXP_INSTR()这样的东西? 如果不匹配则返回零,否则返回匹配子字符串的第一个字符(或后面的第一个字符)的位置。
select
mytab.*,
regexp_substr(my_clob_field, searchString),
regexp_instr(my_clob_field, searchString)
from sys.my_table mytab
WHERE CONTAINS(my_clob_field, '" + searchString + "', 1) > 0
老问题,但结合regexp_instr,regexp_count以及CONNECT BY LEVEL,我想你可以得到你想要的东西:
with base_qry as
(
select 'ABCDABCDABCDEFGAB' as the_text from dual union all
select '123456890AB' as the_text from dual union all
select 'QCQC12345654321QCQC' as the_text from dual
), levels as
(
SELECT LEVEL AS lvl
FROM DUAL
CONNECT BY LEVEL <= ( SELECT MAX( regexp_count(the_text, :search_parm) ) FROM base_qry )
)
select the_text, :search_parm, REGEXP_INSTR(the_text, :search_parm, 1, lvl) as start_pos
from base_qry inner join
levels on (lvl <= regexp_count(the_text, :search_parm))
order by 1, 3
结果(输入AB):
THE_TEXT :SEARCH_PARM START_POS
123456890AB AB 10
ABCDABCDABCDEFGAB AB 1
ABCDABCDABCDEFGAB AB 5
ABCDABCDABCDEFGAB AB 9
ABCDABCDABCDEFGAB AB 16
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.