我正在使用Oracle 11g和Oracle Text作为网络搜索引擎。
我现在已经创建了& text-indexed一个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解决方案。
可能的解决方案:
第一个解决方案:我正在考虑重新设计数据库,如下所示。我要制作一张新表Keywords(pkID NUMBER, nonUniqueID NUMBER, singlePhrase VARCHAR2(100 BYTE))
。我会将之前的列Keyword
更改为KeywordNonUniqueID
,这将保留ID(而不是值列表)。在搜索时,我使用新的Keyword
表进行INNER JOIN。这个解决方案的问题是,除了短语之外,我将获得包含相同数据的多行。我认为这会破坏排名吗?
第二个解决方案:是否可以将短语作为XML存储在原始Keyword
列中,并以某种方式告诉Oracle Text在XML中进行搜索?
第3个解决方案:?
请注意,通常情况下,不会有很多短语(少于100个),也不会很长(单个短语最多可包含5个单词)。
另请注意,我目前正在使用CONTAINS
及其一些运算符,以满足我的全文搜索需求。
编辑:此https://forums.oracle.com/forums/thread.jspa?messageID=10791361讨论几乎解决了我的问题,但它也匹配单个单词,而不是整个短语(完全匹配)。
答案 0 :(得分:1)
Oracle支持默认搜索短语。 在docs我们可以看到这个
4.1.4.1包含短语查询
如果查询表达式中包含多个单词,则仅分隔 通过空格(没有运算符),单词串被认为是a 短语和Oracle Text在查询期间搜索整个字符串。
例如,查找包含该短语的所有文档 国际法,请使用国际法这一短语输入您的疑问。
我是否回答了您的问题或误解了您?
P.S。在我看来,解决方案是转换
“你好,你好;那里有人吗?;不;” “只是;基本事实;”
到
“你好,你好,那里有人吗?aa nope aa”“只是一个基本的 事实aa“
并使用CONTAINS搜索短语“那里有人吗?aa”