【问题标题】:Does Microsoft Access have Full Text Search?Microsoft Access 有全文搜索吗?
【发布时间】:2008-12-30 02:45:13
【问题描述】:

Microsoft Access 有全文搜索吗?

我知道 MySQL 和 SQL Server 都有全文搜索,但我对 Access 不太确定。

如果 Access 没有全文搜索,那么实现全文搜索相同目标的最佳选择是什么?

谢谢

【问题讨论】:

  • 不要使用 Access。这是你最好的选择。
  • 听正义的,他是明智的。

标签: ms-access full-text-search


【解决方案1】:

我不能 100% 确定,但来自 Microsoft 的 this site 没有提到 Access 的事实告诉我答案是“否”。

我的直觉反应也是“不”。 Access 并不打算成为关系数据库技术中的ne plus ultra。如果是这样,SQL Server 就没有理由了。

【讨论】:

    【解决方案2】:

    全文搜索的第一步是创建一个包含数据库中所有单词的单词列表。全文搜索还具有其他功能,例如词干提取,它将派生词与基本词相关联(快速、更快、最快),并且它具有被忽略的停用词,因为它们很常见(并且,the)。一个小的 VBA 代码可以生成一个可以直观地扫描的单词列表。再做一些工作,就可以在搜索数据库之前先使用代码检查单词列表,这可能会使搜索速度更快。下面是我为此目的创建的一些代码。它的实际应用是在数据库中查找人名,以便我可以删除或更改它们以保护隐私,作为生物学家,我想在报告中用斜体显示科学名称。如果我可以创建一个科学名称列表,那么我可以将它们替换为包含在 html 标记中的名称。

    代码运行良好,但我没有对它进行广泛的测试,也没有针对大型备忘录字段/富文本字段进行测试。它是用 Access 2010 编写的。

    'This code requires a table called tblWordList with fields called Word (str 255), WordCount (long), FirstCopyID (long)
    
    Option Compare Database
    Option Explicit
    
    'Click on this procedure and press F5 to run the code
    Private Sub ScopeWordList()
    
        'A list of tables and fields that need to be processed
        Call CreateWordList("Issues", "IssueSummary", "IssueID")
    
    End Sub
    
    'The main routine that finds new words
    Public Sub CreateWordList(TableName As String, FieldName As String, ForeignKey As String)
    
        Dim dbs As Database
        Dim rst As Recordset
        Dim SQL_Statement As String
    
        Dim r As Recordset
    
        Dim RowText As String
        Dim OriginalWord As String
        Dim SearchWord As String
        Dim SearchTerm As String
        Dim Quote As String: Quote = Chr$(34)
        Dim i As Long
        Dim RecNum As Long
    
        SQL_Statement = "SELECT " & FieldName & ", " & ForeignKey & " AS FirstCopyID FROM " & TableName & " WHERE " & FieldName & " IS NOT NULL;"
        Set dbs = CurrentDb()
        Set rst = dbs.OpenRecordset(SQL_Statement, dbOpenSnapshot)
    
        Set r = dbs.OpenRecordset("tblWordCounts", dbOpenTable)
        r.Index = "Word"
    
        With rst
        If .RecordCount = 0 Then GoTo ExitCreateWordList
    
        Do Until .EOF
            Dim RowWords As Variant 'holds an array which needs to be created
            RowText = .Fields(0)
            'strip out quotes, slashes and other characters
            RowText = CleanLine(RowText)
            'split data into words
            RowWords = Split(RowText, Space(1))
    
            For i = LBound(RowWords) To UBound(RowWords)
                OriginalWord = RowWords(i)
                SearchWord = Left(Trim(OriginalWord), 254)
                If Len(SearchWord) > 0 Then
                        r.Seek "=", SearchWord
                        If r.NoMatch Then
                            r.AddNew
                            r!Word = SearchWord
                            r!wordcount = 1
                            'records ID field of first occurrence, so you can debug unexpected results
                            r!FirstCopyID = !FirstCopyID
                            r.Update
                        Else
                            r.Edit
                            r!wordcount = r!wordcount + 1
                            r.Update
                        End If
                    End If
    '            End If
            Next i
            RecNum = RecNum + 1
            If RecNum Mod 20 = 0 Then Debug.Print "Record " & RecNum
            .MoveNext
        Loop
    
    ExitCreateWordList:
        End With
        Debug.Print "Done"
        Set rst = Nothing
        Set dbs = Nothing
    
    
    End Sub
    
    'Need to clean out unwanted characters and replace then with normal spaces
    Private Function CleanLine(RowText As String) As String
    
            Dim X As Long
            Dim Y As String
            Dim Z As Long
            Dim W As String
    
            For X = 1 To Len(RowText)
                Y = Mid(RowText, X, 1)
                Z = Asc(Y)
                Select Case Z
                    Case 65 To 90      'capital letters
                        W = W & Y
                    Case 97 To 122     'lowercase letters
                        W = W & Y
                    Case Else
                        W = W & Space(1)
                End Select
            Next
            CleanLine = W
    
    End Function
    
    'Delete all records in Word List table
    Public Sub ClearWordList()
    
        Dim SQL_Statement As String
    
        'Delete all records from tblWordCounts
        SQL_Statement = "DELETE FROM tblWordCounts"
        DoCmd.SetWarnings False
        DoCmd.RunSQL SQL_Statement
        DoCmd.SetWarnings True
    
    End Sub
    

    【讨论】:

      【解决方案3】:

      MSDE (now called Sql Server Express) 具有全文索引,如果您正在寻找可在客户端部署的数据库

      【讨论】:

        【解决方案4】:

        @duffymo 提供的示例代码运行良好。我将它与 Microsoft Access 2003 一起使用。但需要进行一些修复。

        1. 表需要定义为: '此代码需要一个名为 tblWordList 的表,其字段名为 Word (text 255)WordCount (number)FirstCopyID (number)

        2. 另一个修复是 tblWordCounts 需要替换为 tblWordList,当然 Call CreateWordList 需要更改为需要发送到 tblWordList 的表和字段。

        在一个有 5000 条记录的表上,它运行得非常快,当我单击 Sub ScopeWordList() 并按 F5 时,我认为它不起作用,但是该模块创建了一个包含 700 多个不同的单词列表记录(用于我的数据表)。感谢 @duffymo 提供了一些简洁的示例代码。

        【讨论】:

          【解决方案5】:

          http://www.dummies.com/how-to/content/finding-records-in-your-access-2003-tables.html

          这是关于使用查找工具的。我还没有尝试过,我不确定它是否适用于备忘录字段。

          【讨论】:

          • 这甚至与全文搜索不一样。 FTS 是一种在数据库中的一个或多个表中搜索一个或多个列的编程方式。您链接到的 CTRL+F 项目是一次性的,当然不是通过代码控制的。
          • 不看它@DNRTech 可能通过执行 docmd 走在正确的道路上。 find 快速检索一些基础数据。
          【解决方案6】:

          Access 不是数据库。但它确实附带了一个默认的数据库引擎 Jet/ACE。我想这就是你的意思,但是当你问这样的问题时,你应该更清楚你的意思。

          Jet/ACE 没有任何全文搜索功能。

          对 Jet/ACE 数据文件进行全文搜索的最佳方法是通过您对计算机上文件的全文搜索功能。这不会很快,也不会通过 SQL 使用。

          您没有说这是什么上下文,但我一般从未见过需要全文搜索,除非在网站上(这是一种预期的功能)。如果您使用 Jet/ACE 作为 HTTP 应用程序的数据存储,那么您选择了错误的数据存储。虽然 Jet/ACE 可以很好地用于小容量只读网站,但这不是一个可取的用法(因为 Jet/ACE 数据库引擎的限制)。

          如果您需要全文搜索,那么您需要一个不同的数据库引擎。

          【讨论】:

          • Access 是一个带有开发平台的 DBMS(VBA、Access Forms 和 Reports)。 Access 文件可以是数据库,但不一定。除非您陈述这些事情,否则您的帖子只会让新用户感到困惑,而不会帮助他们加深对产品的理解,因为 Access 通常被称为数据库。同样,SQL Server 不是数据库,而是 DBMS。 SQL Server 和 Access 的文件代表的区别在于 SQL Server 文件始终是数据库文件。
          • @awrigley:除了重申我在回答中所说的话之外,您的评论还有什么意义?我的回答很清楚,我说的是 Jet/ACE 数据库引擎。我写的内容完全没有歧义。你真的应该推翻反对票,因为你的评论只是胡言乱语。
          • Access 的新手阅读了一个回答说 Access 不是数据库,但评论没有扩展 Access 是什么,除了首字母缩略词?这对新人来说是胡言乱语。不赞成票,不仅仅是因为您的评论幼稚。
          • 你说我的评论重申了你所说的然后你说我的评论是胡言乱语。做好决定。我的评论以一种可能只会帮助提出这个问题的人的方式重申你所说的话。这就是 SO 的全部意义所在。
          • 问题是问“(...)什么是最好的替代品(...)j”。说“改变你的工具”是一条简单的道路,但我永远不会低估作者这样做。我确信她/他有充分的理由保留该工具并尝试找到解决方法。通过展示您对 Access 的挫败感并在 Jet/ACE 上发表个人神秘评论,没有任何答案。声明很明确:另一种选择。如果您有它,请将其作为答案发布。所有其他考虑都是徒劳的,应该继续 cmets。
          猜你喜欢
          • 2016-06-19
          • 1970-01-01
          • 2016-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-07
          • 2010-10-11
          相关资源
          最近更新 更多