Microsoft Access是否具有全文搜索?

时间:2008-12-30 02:45:14

标签: ms-access full-text-search

Microsoft Access是否具有全文搜索功能?

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

如果Access没有全文,那么实现全文搜索目标的最佳方法是什么?

由于

6 个答案:

答案 0 :(得分:3)

我不是百分之百确定,但微软this site未提及Access的事实告诉我答案是“不”。

我的直觉反应也是“不”。访问不是关系数据库技术中的 ne plus ultra 。如果是的话,SQL Server就没有理由。

答案 1 :(得分:2)

全文搜索的第一步是创建一个包含数据库中所有单词的单词列表。全文搜索还具有其他功能,如词干,将派生词与基本词(快速,快速,最快)相关联,并且它具有被忽略的停用词,因为它们非常常见(和)。一个小的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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

@duffymo 提供的示例代码非常有效。我在Microsoft Access 2003中使用它。但是有一些修复是必要的。

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

  2. 其他修正 tblWordCounts 需要替换为 tblWordList ,当然调用CreateWordList 需要更改为需要发送到 tblWordList 的表格和字段。

  3. 在5000记录表上,它运行得如此之快我以为当我点击 Sub ScopeWordList()并按下F5时它没有工作,但是模块创建了一个单词列表700个不同的记录(对于我的数据表)。感谢 @duffymo 获取一些简洁的示例代码。

答案 4 :(得分:-1)

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

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

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

你没有说明这是什么背景,但我一般都没有看到需要全文搜索,除了在网站上(它具有预期的能力)。如果您使用Jet / ACE作为HTTP应用程序的数据存储区,那么您选择了错误的数据存储。虽然Jet / ACE可以很好地用于低容量只读网站,但这不是一个明智的用法(因为Jet / ACE数据库引擎的限制)。

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

答案 5 :(得分:-1)

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

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