sql-server - 如何实现企业搜索

标签 sql-server oracle search full-text-search search-engine

我们正在公司中搜索不同的数据源。我们有多个数据库中的信息,需要从我们的Intranet中进行搜索。全文搜索(FTS)的初步实验令人失望。我们已经实现了一个自定义搜索引擎,可以很好地满足我们的目的。但是,我们要确保我们做的是“正确的事情”,并且不会丢失任何会使我们的工作变得更轻松的出色工具。

我们需要的:


列搜索


按列搜索的能力
我们标记表中哪些列是可搜索的

在数据库列和数据之间保持某种关系


我们提供对结果的高级过滤
促进(亚马逊风格)过滤
通过结果分组提供过滤器,并允许用户通过复选框过滤它们
这是一个很棒的功能,用户非常喜欢

部分词匹配


我们有很多唯一的标识符(产品ID等)。
唯一ID可以包含具有含义的子部分(位置等)
或只有一部分可用(当用户搜索时)
或(由于绝对错误的设计决定)id中可能有空白
这是我们现在通过CHARINDEX(MSSQL)和INSTR(ORACLE)实现的一项主要功能
与全文相比,使用char索引函数在MSSQL上的性能等效(+/-)
没有在Oracle上测试
但是针对两种类型的数据库的搜索都非常快
我们利用索引(MSSQL)和物化(Oracle)视图来提高速度


这是一个巨大的胜利,Oracle物化视图优于MSSQL索引视图
两者都在只读联接情况下(例如搜索梳理公司和产品)提供加速

符合用户对范例的期望的搜索CTRL-f->输入文本->查找匹配项
全文搜索在该领域不是最好的(匹配缓慢且不一致)
部分匹配(请参阅“部分单词匹配”)



很高兴有:


实时搜索数据库


跳过索引跳过,这不是硬性要求

拼写建议


Xapian有这个http://xapian.org/docs/spelling.html
类似于Google的“您是不是要说:”



我们不需要的:


我们不需要索引文件


在这一点上,搜索我们的数据源是最重要的
即使我们搜索文档,我们也会寻找部分单词匹配等

排行


我们自己的简单排名算法已证明比FTS等效要好得多。
用户了解它,我们了解它,它几乎总是相关的。

抽干


只是不需要获取[运行|运行|运行]

进阶搜寻运算子


词组匹配,或/和,等等
根据雅各布·尼尔森http://www.useit.com/alertbox/20010513.html


大多数用户使用简单的搜索词组
很少使用高级搜索(如果可用)
也位于Information Architecture 3rd Edition Page 185中
“很少有用户会利用它们[高级搜索功能]”
http://oreilly.com/catalog/9780596000356
我们的类似Amazon的过滤功能无论如何都可以实现更好的过滤(通过用户测试)


全文搜索


我们发现结果并不总是对用户“有意义”
使用FTS进行搜索很难调优(哪些运营商符合用户期望)
高级搜索运算符绝不可行
我们不需要它们,因为
用户不理解
性能与char索引函数非常接近(+ / 1)
但结果有时只是“怪异”



问题:
有没有一种解决方案可以让我们保留键值对的“过滤功能”,提供特定于列的匹配,部分单词匹配以及其余功能,而无需进行全文搜索?

我愿意接受任何建议。我想知道是否可以使用文档/哈希表nosql数据存储(MongoDB等)? (http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo)。任何经验,不胜感激。

同样,只要确保我们内部定制版本不会丢失任何内容即可。如果有“现成的”东西,我会对它感兴趣。或者,如果您是从某些组件中构建的,那么您使用了哪些组件(搜索引擎,数据存储等),为什么?

您也可以为FTS做好准备。在您说“只使用全文搜索,因为这是我们拥有的唯一工具”之前,只需确保它满足上述要求即可。

最佳答案

我最终编写了自己的代码。

结果太棒了。用户喜欢它,它可以与我们现有的技术很好地配合使用。

真的不是那么难。只是花了一些时间。

特征:


多面搜索(亚马逊,沃尔玛等)
部分单词搜索(真正的东西不是全文)
搜索数据库(Oracle,SQL Server等)和非数据库源
与我们现有的环境很好地集成
保持关系,所以我可以进行n到n的搜索和显示
->这意味着我可以在搜索结果中显示主记录的子记录
->我也可以搜索任何子字段并返回主记录


使用字典和大量内存可以做的事情真是令人惊讶。

关于sql-server - 如何实现企业搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3198901/

相关文章:

cocoa - 核心数据,排序搜索——可能吗?

sql - 使用公用表表达式进行简单选择

sql-server - sp_help 中的FixedLenNullInSource 是什么意思?

sql - 使用 Oracle 表类型执行动态 native SQL 会出现无效标识符错误

java - 如何复制 Liferay 中现有的组织角色并将其添加到已拥有原始角色的用户中?

Oracle 对某些用户隐藏列

c# - 如何从 .net 应用程序针对 sqlserver 运行 sql 并像使用 SQL Management Studio 一样获得输出?

sql-server - 如何将数据集合传递到 SQL Server 2003 中的 T-SQL 存储过程

php - Mysql 文本搜索问题

search - 检索文档的一些重要术语