我们使用 SharePoint Server 2007 允许员工搜索网络文件共享,但在索引文件时,文件名中的下划线似乎不被视为单词分隔符。
因此,搜索巧克力将要:
- 匹配 ”巧克力奶昔.doc”
- 但不匹配“chocolate_cake.doc”
(当然,这是一个简化的例子;在实践中内容第二个文件的搜索词可能包含单词“chocolate”,并匹配该单词而不是文件名。但问题本身是真实存在的,因为在公司环境中,一种常见的情况是用户知道他们要查找的文件的部分名称,并希望在搜索结果的顶部看到匹配的文件名。在文件名中使用下划线是我们公司广泛使用的惯例)。
下划线在文件内容中也不会被视为单词分隔符,尽管我们不太担心这一点。这个问题的根本原因是可能与 SharePoint 使用的断字符的行为有关(即实现 IWorkBreaker 接口的特定于语言的 DLL),尽管我尚未确认这一点。
有人知道这个问题的解决方法吗?我也测试过 Search Server 2008 Express(基于相同的技术),它也受到影响。我不知道 SharePoint 2010 中是否修复了这个问题。
答案1
答案2
我已经确认,分词器决定了文档内容和文件名的下划线处理方式。分词器是在注册表中根据每种语言进行配置的。
分词器以 ActiveX 控件的形式实现,理论上应该可以编写自己的分词器(Microsoft Platform SDK for Windows XP 包含一个示例“lrsample”),但我手头没有工具可以这样做。似乎 Microsoft 提供的许多分词器都将下划线视为单词的一部分,但我确实找到了一个在下划线处分词的分词器:简体中文分词器版本 2(chsbrkr.dll - 1,677,824 字节)。请注意,此行为与简体中文分词器版本 3 不同,后者是 Search Server 2008 Express 和 SharePoint 2007 中提供的分词器。
因此,为了获得我想要的搜索行为,我已将 SharePoint Search 配置为使用此分词器:
- 将 DLL 复制到 C:\Program Files\Microsoft Office Servers\12.0\Bin\chsbrkr2.dll
- 使用 regedit 浏览到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office Server\12.0\Search\Setup\ContentIndexCommon\LanguageResources\Default
- 对于相关语言,在我的情况下是“英语(英国)”和“英语(美国)”,修改以下键:(
"WBDLLPathOverride" = "C:\PROGRA~1\MI54E7~1\12.0\Bin\ChsBrkr2.dll"
您的路径可能不同)和"WBreakerClass" = "{9717fc70-c1bc-11d0-9692-00a0c908146e}"
- 重新启动“Office SharePoint Server Search”服务(可以通过命令行运行,
net stop osearch
然后执行 来完成net start osearch
)。 - 转到搜索管理页面并启动完整爬网。
除了将下划线视为分词符之外,我不确定 chsbrkr.dll 和默认英语分词器之间是否存在其他重大差异,但到目前为止,它没有给我带来任何问题。如果有一种方法可以将自定义分词器应用于特定的托管属性(在本例中为 Path),那就太好了,但我不知道这是否可行。数据库的 MSSManagedProperties 表中有一个名称很有希望的列,名为“WordBreakerOverride”,但我不知道它的用途是什么。
笔记:在 SharePoint 2010 中,托管属性显然有一个名为 SplitStringCharacters 的附加设置,这很可能使这种解决方法过时。