2

有一个奇怪的。我正在做一个 NotesDatabase.ftsearch 并且当它应该返回一个时它返回了 3 个文档。此外,其中 2 个文档为空/null。

我的查询很简单: field contact="John Smith" field form="Contact"

当我在 Notes 客户端的视图搜索中发出查询时,我得到了我期望的一个文档。Lotus Script 正在返回 3 个文档(我正在调试器中),前 2 个在任何字段中都没有值(实际上,“Items”是空的),但它们正在被返回从 ftsearch 到 DocCollection 作为合法命中。此时我的解决方案是检查哪个文档有一个非空的“项目”字段。关于可能导致这种情况的任何想法,想法?

谢谢克莱姆

这是使用以下搜索的调试:SET CONFIG Debug_FTV_Search=1

[04FC:0092-1274] Query: FIELD firstname = "Joe" AND FIELD lastname ="Customer" and field form ="Contact" 
[04FC:0092-1274] Engine Query: ("Joe"@F215 * "Customer"@F216 * "Contact"@F206) 
[04FC:0092-1274] GTR query performed in 68 ms. 3 documents found    
[04FC:0092-1274] 0 documents disualified by deletion 
[04FC:0092-1274] 0 documents disqualified by ACL 
[04FC:0092-1274] 0 documents disqualified by IDTable 
[04FC:0092-1274] 0 documents disqualified by NIF 
[04FC:0092-1274] Results marshalled in 1 ms. 3 documents left 
[04FC:0092-1274] OUT FTGSearch error = 0 
[04FC:0092-1274] FTGSearch: found=3, returned=3, start=0, count=0, limit=0 
[04FC:0092-1274] Total search time 69 ms. 
[04FC:0092-135C] IN FTGCloseSearch 
[04FC:0092-1290] IN FTGSearch
4

2 回答 2

4

我在这里有点冒险,但我认为这些是您(或您的代理,如果您的代码是这样运行的)无法访问的文档。让您的代码检查这些文档的 NotesDocument.IsValid()。它可能会以虚假的形式回来。

如果我是对的,只需将该检查添加到您的代码中即可清除这些文档。或者,如果您对您无权访问的文档感到惊讶,请授予自己完全访问管理员权限并重新运行代码。这应该会为您提供这些文档,以便您可以查看“读者”和/或“作者”字段并找出您没有看到它们的原因。

于 2013-08-14T01:17:08.133 回答
1

我发现,有时在数据库中有我称之为“奇怪的文档”的东西。您可以使用视图 (getnextdocument)、ftsearch 或其他各种方式获取它们。

对于我发现的视图,这些奇怪的文档大多来自过时的视图索引。ftsearches 也一样。在这种情况下,重建视图索引或 ft 索引通常会使文档消失。但是:通常你不想在每次运行这样的代理之前重建视图索引。

这就是为什么我的所有代码在任何类型的文档中都首先检查三件事:doc.isdeleted(有时会返回删除存根)、doc.isvalid 和 isempty(doc.items)。在一个数据库中,我什至不得不将 isempty 包装在一个错误处理程序中,因为这个调用导致了一个错误。

我发现仅省略其中一项检查可能意味着仍会处理奇怪的文档。由于这在我身上经常发生在不同数据库上的不同客户身上,所以我编写了一个小函数 IsDocValid,我在运行集合时总是调用它。

Function IsDocValid( doc as NotesDocument ) as Boolean
  Dim blnValid as Boolean
  blnValid = False
  On Error Goto ErrorHandler
  If not doc.IsDeleted then
    If doc.IsValid then
      If not isempty( doc.Items ) then
        blnValid = True
      End If
    End If
  End If
EndFunction:
  IsDocValid = blnValid
ErrorHandler:
  Resume EndFunction
End Function

在我的循环中,我这样使用:

Set doc = .....
If IsDocValid( doc ) then
  'Do the processing
End If
于 2013-08-22T07:26:41.367 回答