2008-12-30 20 views
9

¿Microsoft Access tiene búsqueda de texto completo?¿Microsoft Access tiene búsqueda de texto completo?

Sé que MySQL y SQL Server tienen Full Text Search, pero no estoy muy seguro de Access.

Si Access no tiene texto completo, ¿cuál es la mejor alternativa para lograr el mismo objetivo de la búsqueda de texto completo?

Gracias

+5

No utilice Access. Esa es tu mejor apuesta. – yfeldblum

+2

Escucha a la justicia, él es sabio. –

+0

¡Gracias Justice y Steven! –

Respuesta

3

no estoy 100% seguro, pero el hecho de que this site de Microsoft no menciona Acceso me sugiere que la respuesta es "no".

Mi reacción visceral también sería "no". El acceso no fue el ne plus ultra en la tecnología de bases de datos relacionales. Si lo fuera, no habría ninguna razón para SQL Server.

-1

acceso no es una base de datos. Pero incluye un motor de base de datos predeterminado, Jet/ACE. Asumo que eso es lo que quieres decir, pero deberías ser más claro a qué te refieres cuando haces una pregunta como esta.

Jet/ACE no tiene ninguna capacidad de búsqueda de texto completo.

La mejor manera de realizar búsquedas de texto completo de archivos de datos Jet/ACE es a través de las capacidades de búsqueda de texto completo que tenga para los archivos en su computadora. Esto no va a ser rápido ni va a ser posible a través de SQL.

Usted no dice qué contexto es esto, pero en general nunca he visto la necesidad de buscar texto completo, excepto en sitios web (donde se espera que sea una capacidad esperada). Si está utilizando Jet/ACE como el almacén de datos para una aplicación HTTP, entonces ha elegido el almacén de datos incorrecto. Aunque Jet/ACE puede funcionar bien para sitios web de solo lectura de bajo volumen, no es un uso recomendable (debido a limitaciones en el motor de base de datos Jet/ACE).

Si necesita una búsqueda de texto completo, necesita un motor de base de datos diferente.

+3

Access es un DBMS con una plataforma de desarrollo atornillada (VBA, Access Forms and Reports). Un archivo de acceso puede ser una base de datos, pero no necesariamente. A menos que indique estas cosas, su publicación solo confundirá a los usuarios nuevos y no les ayudará a desarrollar su comprensión del producto, dado que Access se denomina genéricamente base de datos. De la misma manera, SQL Server no es una base de datos, sino un DBMS. La diferencia, en términos de lo que representan sus archivos, entre SQL Server y Access es que los archivos de SQL Server son siempre archivos de bases de datos. – awrigley

+0

@awrigley: ¿cómo es tu comentario, algo más que repetir lo que dije en mi respuesta? Estoy bastante claro en mi respuesta que estoy hablando del motor de base de datos Jet/ACE. No hay ambigüedad en absoluto en lo que escribí. Deberías revertir el downvote, ya que tu comentario es solo un galimatías. –

+2

Un recién llegado a Access lee una respuesta que dice que Access no es una base de datos, pero el comentario no se expande sobre qué es Access, excepto en acrónimos. Eso es un galimatías para un recién llegado. El voto en negativo se sostiene, no solo porque tu comentario es pueril. – awrigley

-1

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

Se trata de utilizar la herramienta de búsqueda. Todavía no lo he probado y no estoy seguro de si funciona en los campos memo.

+1

Esto no es ni cerca de lo mismo que la búsqueda de texto completo. FTS es una forma programática de buscar una o más columnas en una o más tablas dentro de una base de datos. El elemento CTRL + F al que vinculó es un tipo de cosa única y ciertamente no se controla a través del código. – NotMe

+0

Sin mirarlo @DNRTech podría estar en el camino correcto al realizar un docmd. encontrar para recuperar rápidamente algunos datos básicos. – Ewen

2

El primer paso en la búsqueda de texto completo es crear una lista de palabras que contenga todas las palabras en la base de datos. La búsqueda de texto completo también tiene otras características como stemming, que relaciona palabras derivadas con una palabra base (rápida, más rápida, más rápida) y tiene palabras stop que son ignoradas porque son muy comunes (y, las). Un pequeño código de VBA puede generar una lista de palabras que se puede escanear visualmente. Con un poco más de trabajo, sería posible usar código para verificar la lista de palabras primero antes de buscar en la base de datos y esto podría hacer que las búsquedas sean mucho más rápidas. Debajo hay un código que creé para este propósito. Su aplicación en la vida real es encontrar nombres de personas en la base de datos para que pueda eliminarlos o modificarlos para la protección de la privacidad y, como biólogo, quiero poner en cursiva los nombres científicos en los informes. Si puedo crear una lista de nombres científicos, entonces puedo reemplazarlos con el nombre incluido en las etiquetas html.

El código funciona bien, pero no lo he probado exhaustivamente ni en campos memo grandes/campos de texto enriquecido. Fue escrito en 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 
0

El código de ejemplo que @duffymo proporciona funciona muy bien. Lo uso con Microsoft Access 2003. Pero un par de correcciones son necesarias.

  1. La mesa tiene que ser definida como: 'Este código requiere una tabla llamada tblWordList con campos llamados Word (texto 255), WordCount (número), FirstCopyID (número)

  2. la otra solución es tblWordCounts necesitaba ser reemplazado con tblWordList, y por supuesto la llamada CreateWordList debe cambiarse a la tabla y el campo que deben enviarse al tblWordList.

En una mesa de registro 5000 se corrió tan rápido que pensé que no funciona cuando hice clic en Sub ScopeWordList() y presioné F5, pero el módulo creado una lista de palabras con más de 700 registros distintos (para mi tabla de datos). Gracias @duffymo por un buen código de ejemplo.

Cuestiones relacionadas