标签: oracle-text

Oracle是否支持全文搜索?

是否有Oracle等同于MS SQL的全文搜索服务?

如果是这样,有没有人实现它并有好/坏的经历?

oracle full-text-search oracle-text

27
推荐指数
2
解决办法
5万
查看次数

Oracle文本使用花括号和通配符进行转义

我希望能够在Oracle文本查询中使用contains转义标准和通配符来转义搜索条件,以获得"双重截断"条件.(我知道我的索引可能没有设置为理想的性能,但这是多余的).我希望能够使用花括号语法以获得最佳可读性,但这不起作用.根据这个相关(但不重复)问题的最佳答案,花括号定义完整的标记.有没有办法禁用或解决此问题?

Oracle Text:如何清理用户输入

我宁愿避免在我的搜索条件中逃避每个字符(根据我的代码中的最后一个选择)或尝试在字符串中搜索特殊字符,因为保留字也被视为"特殊".(请注意,我没有停止的话)以下是我的问题所在.(不幸的是,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)

sql oracle oracle-text

26
推荐指数
1
解决办法
2095
查看次数

查询名称数据库的建议

我有一个Oracle数据库,像许多人一样,有一个包含传记信息的表.在其中,我想以"自然"的方式按名称搜索.

该表有forenamesurname字段,目前,我正在使用这样的东西:

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功能.例如,我的开发数据显示"乔纳森彼得杰森史密斯"在顶部 - 罚款 - 但"简玛格丽特辛普森"与"约翰特伦斯史密斯"处于同一水平

我认为删除前面的通配符可能会提高性能而不会降低结果,因为在现实生活中,您永远不会在名称中间搜索块.但是,否则,我对这些想法持开放态度......这种情况必须在恶心的情况下实施!任何人都可以建议一个更好的方法来处理我现在正在做/考虑的事情吗? …

sql oracle full-text-search soundex oracle-text

12
推荐指数
1
解决办法
728
查看次数

Oracle:带条件的全文搜索

我创建了一个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 …

sql oracle indexing oracle-text full-text-indexing

11
推荐指数
1
解决办法
1万
查看次数

如何同步和优化Oracle Text索引?

我们希望使用ctxsys.context索引类型进行全文搜索.但我很惊讶,这种类型的索引不会自动更新.我们有300万份文件,每天更新/插入/删除约10万次.

您对同步和优化Oracle Text索引有何建议?

oracle full-text-search oracle-text

9
推荐指数
2
解决办法
3万
查看次数

设置Oracle Text以索引Oracle表中多列的值

我有一组Oracle表来描述有关业主的信息.对于每个所有者,所有者名称和其他文本值存储在多个相关表中的多个字段中.我想索引这些字段的内容.我的目标是提供一个字段,用户可以在其中输入关键字来查找所有者.

如何设置Oracle Text来实现此目的?

oracle indexing oracle-text

7
推荐指数
1
解决办法
6741
查看次数

JPA中的Oracle Text Criteria Query

是否可以使用Oracle Text的contains语句执行JPA Criteria Query,如果是,如何执行?

jpa oracle-text criteria-api

6
推荐指数
2
解决办法
3338
查看次数

oracle文本使用accum和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)

sql oracle oracle-text

5
推荐指数
1
解决办法
590
查看次数