2013-01-09 90 views
1

我正在使用Oracle 11g和Oracle Text作为Web搜索引擎。在Oracle中使用逗号分隔值搜索列

我现在创建了&文本索引CLOB列Keywords其中包含空格分隔的单词。这允许我扩展搜索,因为Oracle Text将返回存储在该列中的具有一个或多个关键字的行。该列的内容对用户是隐藏的,仅用于“扩展”搜索。这是按预期工作的。

但现在我需要支持多个单词甚至完整的句子。使用当前配置,Oracle Text将仅搜索单个关键字。如何存储短语并配置Oracle Text以便搜索整个短语(完全匹配是首选,但模糊匹配也可以)?

列两排(分号分隔值)的内容的示例:

"hello, hello; is there anybody out there?; nope;" 
"just the; basic facts;" 

我发现了一个类似的问题:Searching a column with comma separated values,不同之处在于需要使用的Oracle 11g的溶液与它的自由文本搜索功能。

可能的解决方案:

1解决办法:我想重新设计DB如下。我会创建一个新表Keywords(pkID NUMBER, nonUniqueID NUMBER, singlePhrase VARCHAR2(100 BYTE))。我会将前一列Keyword更改为KeywordNonUniqueID,这将保存ID(而不是一个值列表)。在搜索时间,我会与新的Keyword表内联合。这个解决方案的问题是我会得到多个包含除短语之外的相同数据的行。我认为这会摧毁排名?

第二种解决方案:是否可以将短语作为XML存储在原始Keyword列中,并以某种方式告诉Oracle Text在XML中进行搜索?

第三种解决方案:?

请注意,通常不会有很多短语(小于100),也不会很长(单个短语最多有5个单词)。

另请注意,我目前使用CONTAINS及其几个操作员来满足我的全文搜索需求。

编辑:这https://forums.oracle.com/forums/thread.jspa?messageID=10791361讨论,几乎解决了我的问题,但它也匹配单个词,而不是整个短语(完全匹配)。

回答

1

Oracle支持默认搜索短语。 在docs我们可以看到这个

4.1.4.1 CONTAINS如果多个字包含在一个查询表达式,仅通过 空白(无操作员)分离短语查询

,词语的字符串被认为是一个 短语和Oracle Text在查询期间搜索整个字符串。

例如,要查找包含词组 国际法的所有文档,请使用国际法来输入您的查询。

我回答你的问题还是误解你?

P.S.在我看来,解决方案是转换

“你好,你好;有没有人在那里?;不! “只是;基本事实”;

“喂,你好AA是没有人在那里?AA没了AA” “只是AA基本 事实AA”

,并搜索包含的短语“有没有人在那里?”一个“

+0

这不是我喜欢的(尽管这个解决方案可能会给我足够好的结果以满足我的需求),因为它还会找到包含以下短语的文档:”international法律和法院“,因为该文件中包含了”国际法“一词。 我想要的是Oracle数据库返回与短语/字符串完全匹配的文档,或者根本没有。 – Howie

+0

也许你可以使用带分隔符的搜索字符串。也就是说,用“国际法”这个短语。与“国际法和法院”的文本不符。如果Oracle Text没有在文字中包含分号,我们可以在短语结尾添加哑符号。例如,“国际法律”和“国际法与法院”的文本将有所不同。只有一个音符:你需要用哑符号检查词的existense。也就是说,如果我们选择“a”作为哑符号并搜索以“abac”为单词结尾的短语,我们可能会得到与单词“abaca”错误匹配的结果。这是罕见的情况,但我们可以添加“aa”:) – knagaev

+0

这很疯狂,但它可能会(_will_)工作! :) – Howie