【发布时间】:2011-03-13 01:13:23
【问题描述】:
我们正在公司中搜索不同的数据源。我们在多个数据库中有需要从我们的 Intranet 搜索的信息。全文搜索 (FTS) 的初步实验证明令人失望。我们已经实现了一个自定义搜索引擎,非常适合我们的目的。但是,我们希望确保我们做的是“正确的事情”,并且不会错过任何可以让我们的工作更轻松的出色工具。
我们需要什么:
- 列搜索
- 能够按列搜索
- 我们标记表中的哪些列是可搜索的
- 在 db 列和数据之间保持某种关系
- 我们提供对结果的高级过滤
- 促进(亚马逊风格)过滤
- 通过结果分组提供过滤器,并允许用户通过复选框对其进行过滤
- 这是一个很棒的功能,用户非常喜欢它
- 部分字匹配
- 我们有很多唯一标识符(产品 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 等效算法好得多。
- 用户理解它,我们理解它,它几乎总是相关的。
- 词干
- 只是不需要 [run|ran|running]
- 高级搜索运算符
- 短语匹配,或/和等
- 根据雅各布尼尔森http://www.useit.com/alertbox/20010513.html
- 大多数用户使用简单的搜索词组
- 很少有人使用高级搜索(如果可用)
- 也在信息架构第 3 版第 185 页中
- “很少有用户利用它们[高级搜索功能]”
- http://oreilly.com/catalog/9780596000356
- 我们的类似亚马逊的过滤允许更好的过滤(通过用户测试)
- 全文搜索
- 我们发现结果并不总是对用户“有意义”
- 使用 FTS 进行搜索很难调整(哪组运算符符合用户的期望)
- 高级搜索运算符是不行的
- 我们不需要它们,因为
- 用户不理解他们
- 性能与 char 索引函数非常接近 (+/1)
- 但结果有时只是“奇怪”
问题: 有没有一种解决方案,可以让我们保留键值对“过滤功能”,提供特定列匹配、部分单词匹配和其他功能,而无需进行全文搜索?
我愿意接受任何建议。我想知道文档/哈希表 nosql 数据存储(MongoDB 等)是否有用? (http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo)。任何与这些相关的经验都值得赞赏。
再次重申,只要确保我们的内部定制版本没有遗漏任何内容。如果有什么“现成的”我会对它感兴趣。或者,如果您使用某些组件构建了一些东西,那么您使用了哪些组件(搜索引擎、数据存储等)以及为什么?
您也可以为 FTS 提出您的观点。在您说“只使用全文搜索,因为这是我们拥有的唯一工具”之前,请确保它符合上述要求。
【问题讨论】:
标签: sql-server oracle search full-text-search search-engine