【问题标题】:"Query is not understandable" - Full text searching where field types have changed“查询不可理解” - 字段类型已更改的全文搜索
【发布时间】:2013-06-13 12:38:28
【问题描述】:

客户有一个长期存在的 IBM Notes 应用程序,其中有人将字段的类型从数字更改为文本。

所以,现在当我们尝试进行 FT 搜索时,例如:[myField] = "1234" 收到错误消息:“查询无法理解”。

如果我这样做:[myField] = 1234 它可以工作,但不会返回任何命中。即使有一个文档 myField = "1234"。

该字段是设计中的文本类型。

我为测试创建了一个新视图,只允许来自一个表单的文档。

删除全文索引(即使在文件系统上) 升级-X 修复 -r 创建全文索引

在我的测试视图中,我有一列显示正在搜索的字段内容是否为文本类型 @IsText(myField) 并且所有行都显示:1(因此它的字段内容必须是文本)

以上都不起作用,所以我在本地创建了一个新的数据库副本。 同样的问题。

创建了一个全新的数据库(仅用于测试)、表单、视图和全文索引,并且可以正常工作。

感觉就像现有的数据库设计在某处存储了旧的字段类型...

任何想法表示赞赏。

谢谢!

/J

【问题讨论】:

    标签: full-text-search lotus-notes lotus-domino full-text-indexing


    【解决方案1】:

    数据类型和字段名称存储在 UNK 表中。每个字段名称只有一个条目,因此在具有不同数据类型的应用程序中不要多次使用相同的字段名称。

    您需要重建 UNK 表,正如我在这里写的博客 http://www.intec.co.uk/full-text-search-musings/

    注意,它必须是离线契约,正如 Duffbert 所说的 http://www.duffbert.com/duffbert/blog.nsf/d6plinks/TDUF-5SMHV4。如果你在做compact的时候数据库中有任何人,它会失败并且UNK表不会被重建。

    【讨论】:

      【解决方案2】:

      链接很有用,但如果您不想从文档中删除数据 - 对我来说,这些步骤是有效的(并且不需要从设计器中的表单中删除字段):

      • 从具有管理员访问权限的设计器运行,其中包含此类代码

        Sub Initialize  
        Dim s As New NotesSession
        Dim db As NotesDatabase
        Dim dc As NotesDocumentCollection
        Dim doc As NotesDocument
        Dim i As Integer
        Dim nc As NotesNoteCollection
        Dim noteid As String
        Dim nextnoteid As string
        Dim itemArr As Variant
        Dim NeedSave As Boolean
        
        Const ITEM_NAME = "itemName1|itemName2"
        
        itemArr = Split( ITEM_NAME, "|" )
        'погромист-кун не должен забывать про наличие итемов в формах...
        Set db = s.Currentdatabase  
        Set nc = db.CreateNoteCollection(False) 
        nc.SelectForms = true
        Call nc.BuildCollection
        noteid = nc.Getfirstnoteid()
        For i =  1 To nc.Count
            Set doc = db.Getdocumentbyid( noteid )
            noteid = nc.Getnextnoteid( noteid )
            NeedSave = false
            ForAll IA In itemArr
                If doc.Hasitem( IA ) Then
                    Call doc.Removeitem( IA )
                    NeedSave = true
                End If
            End ForAll
            If NeedSave Then
                Call doc.Save( True, False )
            End If
            Print CStr( i ) & "\" & CStr( nc.Count )
        Next    
        
        End Sub
        
      • 删除数据库索引

      • 从管理员命令 lo compact database.nsf -c 运行,如上面链接中所述
      • 创建索引

      【讨论】:

        猜你喜欢
        • 2012-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-19
        • 2019-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多