繁体   English   中英

Oracle Database 12c:如何从包含搜索中获取结果索引

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM