ftsearch返回空文档

时间:2013-08-13 18:29:26

标签: lotus-notes

有一个奇怪的。我正在做一个NotesDatabase.ftsearch,当它返回一个时,它返回3个doc。此外,其中两个文档为空/ null。

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

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

感谢 CLEM

以下是使用以下内容进行的调试调试: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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

这就是为什么我的所有代码都通过任何类型的文档首先检查三件事:doc.isdeleted(有时返回删除存根),doc.isvalid AND 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