是否有Oracle等同于MS SQL的全文搜索服务?
如果是这样,有没有人实现它并有好/坏的经历?
我希望能够在Oracle文本查询中使用contains转义标准和通配符来转义搜索条件,以获得"双重截断"条件.(我知道我的索引可能没有设置为理想的性能,但这是多余的).我希望能够使用花括号语法以获得最佳可读性,但这不起作用.根据这个相关(但不重复)问题的最佳答案,花括号定义完整的标记.有没有办法禁用或解决此问题?
我宁愿避免在我的搜索条件中逃避每个字符(根据我的代码中的最后一个选择)或尝试在字符串中搜索特殊字符,因为保留字也被视为"特殊".(请注意,我没有停止的话)以下是我的问题所在.(不幸的是,SQLFiddle似乎不支持Oracle文本):
create table MY_TABLE(MY_COL varchar2(20));
insert into MY_TABLE(MY_COL) values ('abc');
insert into MY_TABLE(MY_COL) values ('abcd');
insert into MY_TABLE(MY_COL) values ('abcde');
insert into MY_TABLE(MY_COL) values ('bcd');
insert into MY_TABLE(MY_COL) values ('bcde');
create index FTIX on MY_TABLE (MY_COL)
indextype is CTXSYS.CONTEXT
PARAMETERS ('STOPLIST CTXSYS.EMPTY_STOPLIST SYNC (ON COMMIT)');
select * from MY_TABLE where CONTAINS(MY_COL, '%bcd%') > 0; --expected results
select * from MY_TABLE where CONTAINS(MY_COL, '%{bcd}%') > 0; --no results
select * from MY_TABLE where CONTAINS(MY_COL, '{bcd}') > …Run Code Online (Sandbox Code Playgroud) 我有一个Oracle数据库,像许多人一样,有一个包含传记信息的表.在其中,我想以"自然"的方式按名称搜索.
该表有forename和surname字段,目前,我正在使用这样的东西:
select id, forename, surname
from mytable
where upper(forename) like '%JOHN%'
and upper(surname) like '%SMITH%';
Run Code Online (Sandbox Code Playgroud)
这可行,但它可能非常慢,因为此表上的索引显然无法解释前面的通配符.此外,用户通常会根据他们通过电话告诉他们的内容来搜索人员 - 包括大量的非英文姓名 - 所以最好也进行一些语音分析.
因此,我一直在试验Oracle Text:
create index forenameFTX on mytable(forename) indextype is ctxsys.context;
create index surnameFTX on mytable(surname) indextype is ctxsys.context;
select score(1)+score(2) relevance,
id,
forename,
surname
from mytable
where contains(forename,'!%john%',1) > 0
and contains(surname,'!%smith%',2) > 0
order by relevance desc;
Run Code Online (Sandbox Code Playgroud)
这具有使用Soundex算法以及全文索引的优点,因此它应该更有效.(虽然,我的轶事结果显示它很慢!)我对此的唯一担忧是:
首先,需要以一些有意义的方式刷新文本索引.使用on commit速度太慢,可能会干扰前端软件(我无法控制)与数据库的交互方式; 所以需要一些思考......
Oracle返回的结果并不是非常自然地排序; 我不太确定这个score功能.例如,我的开发数据显示"乔纳森彼得杰森史密斯"在顶部 - 罚款 - 但"简玛格丽特辛普森"与"约翰特伦斯史密斯"处于同一水平
我认为删除前面的通配符可能会提高性能而不会降低结果,因为在现实生活中,您永远不会在名称中间搜索块.但是,否则,我对这些想法持开放态度......这种情况必须在恶心的情况下实施!任何人都可以建议一个更好的方法来处理我现在正在做/考虑的事情吗? …
我创建了一个Oracle Text索引,如下所示:
create index my_idx on my_table (text) indextype is ctxsys.context;
Run Code Online (Sandbox Code Playgroud)
然后我可以做以下事情:
select * from my_table where contains(text, '%blah%') > 0;
Run Code Online (Sandbox Code Playgroud)
但是,假设我们在此表中有另一列,比如说group_id,我想要执行以下查询:
select * from my_table where contains(text, '%blah%') > 0 and group_id = 43;
Run Code Online (Sandbox Code Playgroud)
使用上面的索引,Oracle将不得不搜索包含的所有项目,'blah'然后检查它们group_id的所有内容.
理想情况下,我更喜欢只搜索项目group_id = 43,所以我想要一个像这样的索引:
create index my_idx on my_table (group_id, text) indextype is ctxsys.context;
Run Code Online (Sandbox Code Playgroud)
有点像普通索引,因此可以为每个索引进行单独的文本搜索group_id.
有没有办法在Oracle中做这样的事情(如果这很重要,我使用的是10g)?
编辑(澄清)
考虑一个包含一百万行的表和以下两列,A以及B两个数字.假设有500个不同的值A和2000个不同的值B,每行都是唯一的.
现在我们考虑一下 select ... where A = x and B …
我们希望使用ctxsys.context索引类型进行全文搜索.但我很惊讶,这种类型的索引不会自动更新.我们有300万份文件,每天更新/插入/删除约10万次.
您对同步和优化Oracle Text索引有何建议?
我有一组Oracle表来描述有关业主的信息.对于每个所有者,所有者名称和其他文本值存储在多个相关表中的多个字段中.我想索引这些字段的内容.我的目标是提供一个字段,用户可以在其中输入关键字来查找所有者.
如何设置Oracle Text来实现此目的?
是否可以使用Oracle Text的contains语句执行JPA Criteria Query,如果是,如何执行?
我正在使用Oracle文本搜索句子语料库我希望得分只计算离散事件,
示例:我的查询是 ( dog cat table )
如果它找到术语"狗",它必须计数1,即使该句子有多个"狗"术语.如果它发现"狗猫"它必须数2 ...等
我使用了这个查询,但如果找到两个术语,它会给我51个.我需要累积离散事件.所以我想要覆盖Oracle Text评分算法的行为.
select /*+ FIRST_ROWS(1)*/ sentence_id
,score(1) as sc
, isn
,sentence_length
from plag_docsentences
where contains(PROCESSED_TEXT,'DEFINESCORE(dog, DISCRETE*.01)
,DEFINESCORE(cat, DISCRETE*.01)'
,1)>0
order by score(1) desc
Run Code Online (Sandbox Code Playgroud)