Microsoft Access 有全文搜索吗?
我知道 MySQL 和 SQL Server 有全文搜索,但我对 Access 不太确定。
如果 Access 没有全文,实现全文搜索相同目标的最佳选择是什么?
谢谢
Microsoft Access 有全文搜索吗?
我知道 MySQL 和 SQL Server 有全文搜索,但我对 Access 不太确定。
如果 Access 没有全文,实现全文搜索相同目标的最佳选择是什么?
谢谢
我不是 100% 确定,但微软的这个网站没有提到 Access 的事实告诉我答案是“不”。
我的直觉反应也是“不”。Access 并非旨在成为关系数据库技术中的佼佼者。如果是这样,SQL Server 就没有理由了。
全文搜索的第一步是创建一个包含数据库中所有单词的单词列表。全文搜索还具有其他功能,例如词干提取,它将派生词与基本词(快速,更快,最快)相关联,并且它具有被忽略的停用词,因为它们非常常见(和,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
@duffymo提供的示例代码运行良好。我将它与 Microsoft Access 2003 一起使用。但需要进行一些修复。
该表需要定义为:'此代码需要一个名为 tblWordList 的表,其中包含名为Word (text 255)、WordCount (number)、FirstCopyID (number)的字段
另一个修复是tblWordCounts需要替换为tblWordList,当然Call CreateWordList需要更改为需要发送到tblWordList的表和字段。
在 5000 条记录表上,它运行得如此之快,我认为当我单击Sub ScopeWordList()并按 F5 时它不起作用,但是该模块创建了一个包含 700 多个不同记录的单词列表(对于我的数据表)。感谢@duffymo提供了一些简洁的示例代码。
http://www.dummies.com/how-to/content/finding-records-in-your-access-2003-tables.html
这是关于使用查找工具的。我还没有尝试过,我不确定它是否适用于备忘录字段。
Access 不是数据库。但它确实附带了一个默认的数据库引擎 Jet/ACE。我会假设这就是你的意思,但是当你问这样的问题时,你应该更清楚你的意思。
Jet/ACE 没有任何全文搜索功能。
对 Jet/ACE 数据文件进行全文搜索的最佳方法是通过您对计算机上文件的全文搜索功能。这不会很快,也不会通过 SQL 使用。
你没有说这是什么上下文,但我通常从未见过需要全文搜索,除非在网站上(这是一种预期的能力)。如果您使用 Jet/ACE 作为 HTTP 应用程序的数据存储,那么您选择了错误的数据存储。虽然 Jet/ACE 可以很好地用于小容量只读网站,但这不是一个可取的用法(因为 Jet/ACE 数据库引擎的限制)。
如果您需要全文搜索,那么您需要一个不同的数据库引擎。