13

Microsoft Access 有全文搜索吗?

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

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

谢谢

4

6 回答 6

3

我不是 100% 确定,但微软的这个网站没有提到 Access 的事实告诉我答案是“不”。

我的直觉反应也是“不”。Access 并非旨在成为关系数据库技术中的佼佼者。如果是这样,SQL Server 就没有理由了。

于 2008-12-30T02:51:14.010 回答
2

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

该代码运行良好,但我没有对它进行广泛的测试,也没有针对大型备忘录字段/富文本字段进行测试。它是用 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
于 2014-12-31T23:19:57.983 回答
1

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

于 2008-12-30T03:37:48.003 回答
0

@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提供了一些简洁的示例代码。

于 2017-05-10T06:38:47.610 回答
-1

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

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

于 2011-02-17T18:20:38.780 回答
-2

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

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

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

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

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

于 2010-07-28T19:18:15.827 回答