搜索Lotus Notes数据库

时间:2015-01-29 15:35:25

标签: search lotus-notes lotus-domino lotusscript lotus

我有大约50个莲花笔记数据库,我需要根据相当复杂的查询搜索(包括RTF和附件)(例如:如果客户= a或b或c或d或e ...或z& ; product = x或y)然后==匹配;和标签(例如标签=找到或未找到)

但是,我不确定最好的方法,并想检查三个选项。

  1. 使用Lotus' '在视图中搜索'索引后应该搜索所有数据库 - 但我不确定它是否会接受一个冗长,复杂的搜索查询

  2. 在Lotus SCRIPT中编写代理以基本上执行1中的搜索。但这可能是让它接受复杂查询的一种方式

  3. 使用外部软件(例如X1 Professional Search)在Lotus Notes之外搜索(但是如果我在Windows资源管理器中识别它们,我不确定是否能够标记文件)。

    < / LI>

    编辑:我的想法是:

    Sub Initialise
    Dim session as New NotesSession
    Dim db as NotesDatabase
    Dim dc as NotesDocumentCollection
    Dim doc as NotesDocument
    Dim searcy_query$
    
    'On current database
    Set db = session.CurrentDatabase
    'Force index of database
    Call db.UpdateFTIndex(True)
    
    'Construct QUERY
    search_query = "(Customer1|Customer2) & (Product1|Product2)"
    'Search
    Set dc = db.FTSearch(query, 0)
    
    If dc.Count=0 Then
                    Msgbox "No matches!"
                    Exit Sub
    End If
    
    ‘Tag the matched documents with “Flag”
    Call dc.StampAll("Flag","Active)")
    End Sub
    

    但是,我不确定这是否会返回所有匹配项以及@TRIM和@UPPER(将它们放入查询的位置,因为我将搜索所有字段和RTF而不是特定字段)

2 个答案:

答案 0 :(得分:2)

首先:一次搜索多个数据库当然可以通过搜索每个单独的数据库“手动”完成,收集结果并找到一种方式以“某种方式”呈现文档(这不会很容易,由于来自不同数据库的文档无法在“一个”视图中显示 - 您需要使用“影子文档”或网络方法(例如XPage))

但是:Lotus Notes有一个内置函数来执行此操作,它被称为“域索引器”。您可以在管理帮助中阅读有关如何设置“域索引”in this IBM Link的详细信息。

使用域索引进行多数据库搜索的示例可以在catalog.nsf中找到“DomainQuery”形式。

据我所知,搜索字符串没有限制,因此您可以使用此技术进行非常复杂的搜索,并为您提供所有匹配。

如果您搜索LotusScript解决方案,请查看NotesDatabase.ftdomainsearch的文档以获取此类示例代码(取自开发人员帮助):

  

以下代码放置在目录编目数据库中的搜索表单上的按钮中时,在目录中搜索指定的查询字符串,并返回所有结果。

Sub Click(Source As Button)
    Dim s As New NotesSession
    Dim db As NotesDatabase
    Dim w As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim doc as NotesDocument
    Dim quer As String
    Dim srdoc as NotesDocument


    Set db=s.CurrentDatabase
    Set uidoc = w.currentdocument
    uidoc.refresh
    Set doc=uidoc.Document

    quer=doc.query(0)

    On Error Resume Next     
    If db.isopen Then
        If Err <> 0 Then
            Messagebox STR_DBOPEN_ERROR, 0 , STR_ERROR
            Err = 0
            Exit Sub
        End If

        Set srdoc = db.ftdomainsearch(quer, 0)

        If Err <> 0 Then
            Messagebox STR_NDF , 0 , STR_LOTUS_NOTES
            Err=0
            Exit Sub
        End If

        srdoc.Form="SearchResults"
        Call w.EditDocument(False, srdoc, True)
    End If
End Sub

答案 1 :(得分:1)

如果你还打算搜索Rich Text,那么简单的方法就是全文搜索,你明白了!

您的查询语法为:

generic_text or ([_CreationDate]<07.10.2014 and ([CustomerFieldName]="Smith" or [CustomerFieldName]="Wesson"))

为了形成结果,我建议查看:AppendDocLink,例如:

Dim session As New NotesSession
Dim db As New NotesDatabase("", "resu.nsf")
Dim newDoc As NotesDocument
Dim rtitem As NotesRichTextItem
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument

Set newDoc = New NotesDocument( db )
Set rtitem = New NotesRichTextItem( newDoc, "Body" )
'you have to loop on your 50 DBs
'Search =>from your code
Set dc = db.FTSearch(query, 0)
while not doc is nothing 
     Call rtitem.AppendDocLink( doc, db.Title )
     Call rtitem.AddTab( 1 )
     Call rtitem.AppendText( doc.FieldImportantInResult( 0 ) )
     Call rtitem.AddNewLine( 1 )
     Set doc = dc.GetNextDocument( doc )
Wend
newDoc.save true, true
'this part is not to add it you plane to run your search in background
Dim w As New NotesUIWorkspace
Call w.EditDocument(False, newDoc, True)