Есть ли в Microsoft Access полнотекстовый поиск? - PullRequest
10 голосов
/ 30 декабря 2008

Есть ли в Microsoft Access полнотекстовый поиск?

Я знаю, что MySQL и SQL Server имеют полнотекстовый поиск, но я не слишком уверен в Access.

Если в Access нет полного текста, какова лучшая альтернатива для достижения той же цели полнотекстового поиска?

Спасибо

Ответы [ 6 ]

3 голосов
/ 30 декабря 2008

Я не уверен на 100%, но тот факт, что этот сайт от Microsoft не упоминает Access, подсказывает мне, что ответ «нет».

Моя внутренняя реакция также была бы "нет". Доступ не был предназначен для ne плюс ультра в технологии реляционных баз данных. Если бы это было так, для SQL Server не было бы никаких причин.

2 голосов
/ 01 января 2015

Первый шаг в полнотекстовом поиске - создать список слов, содержащий все слова в базе данных. Полнотекстовый поиск также имеет и другие функции, такие как определение слова, которое связывает производные слова с базовым словом (быстро, быстрее, быстрее) и содержит стоп-слова, которые игнорируются, потому что они так часто встречаются (и). Небольшой код VBA может генерировать список слов, который можно визуально сканировать. Приложив немного больше работы, можно было бы использовать код для проверки списка слов перед поиском в базе данных, и это может сделать поиск намного быстрее. Ниже приведен код, который я создал для этой цели. Его реальное применение состоит в том, чтобы находить имена людей в базе данных, чтобы я мог удалить или изменить их для защиты конфиденциальности, и как биолог, я хочу выделять научные имена в отчетах. Если я смогу создать список научных названий, я смогу заменить их на имена, заключенные в HTML-теги.

Код работает хорошо, но я не проверял его всесторонне или в отношении больших полей memo / полей расширенного текста. Это было написано в 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
1 голос
/ 30 декабря 2008

MSDE (теперь называется Sql Server Express) имеет полнотекстовое индексирование, если вы ищете базу данных, развертываемую на клиенте

0 голосов
/ 10 мая 2017

Пример кода, который предоставляет @ duffymo , работает очень хорошо. Я использую его с Microsoft Access 2003. Но необходимо несколько исправлений.

  1. Таблица должна быть определена как: Для этого кода требуется таблица с именем tblWordList с полями с именем Word (текст 255) , WordCount (число) , FirstCopyID (число)

  2. Другое исправление tblWordCounts необходимо заменить на tblWordList , и, конечно, Call CreateWordList необходимо изменить на таблицу и поле, которое необходимо отправить в tblWordList .

В таблице записей 5000 он работал так быстро, что я подумал, что она не работает, когда я нажал на Sub ScopeWordList () и нажал F5, но модуль создал список слов с более чем 700 различными записями (для моей таблицы данных). Спасибо @ duffymo за отличный пример кода.

0 голосов
/ 17 февраля 2011

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

Речь идет об использовании инструмента поиска. Я еще не пробовал, и я не уверен, работает ли он на памятных полях.

0 голосов
/ 28 июля 2010

Доступ не является базой данных. Но он поставляется с ядром базы данных по умолчанию, Jet / ACE. Я предполагаю, что это то, что вы имеете в виду, но вы должны быть более ясными, что вы имеете в виду, когда задаете такой вопрос.

Jet / ACE не поддерживает полнотекстовый поиск.

Лучший способ выполнить полнотекстовый поиск файлов данных Jet / ACE - использовать любые возможности полнотекстового поиска файлов на вашем компьютере. Это не будет быстрым и не будет пригодным для использования через SQL.

Вы не говорите, что это за контекст, но я вообще никогда не видел необходимости в полнотекстовом поиске, кроме как на веб-сайтах (где это что-то ожидаемое). Если вы используете Jet / ACE в качестве хранилища данных для приложения HTTP, значит, вы выбрали неправильное хранилище данных. Хотя Jet / ACE может нормально работать для небольших веб-сайтов, предназначенных только для чтения, это нежелательно (из-за ограничений в ядре базы данных Jet / ACE).

Если вам нужен полнотекстовый поиск, вам нужен другой движок базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...