Sono disponibili strumenti open source o commerciali che consentono l'indicizzazione del frammento di testo dei contenuti del database e possono essere interrogati da Java?Come cercare frammenti di testo in un database
Sfondo della domanda è una grande tabella di database MySQL con diverse centinaia di migliaia di record, contenente diverse colonne VARCHAR. In queste colonne le persone vorrebbero cercare i frammenti dei contenuti, quindi un indice di testo completo (basato sui confini delle parole) non sarebbe di aiuto.
EDIT: [aggiunta di rendere chiaro il motivo per cui questi primi suggerimenti non risolverebbe il problema:]
Questo è il motivo di MySQL costruito nel indice full-text, non farà il lavoro, e nessuno dei due si Lucene o Sfinge, tutto di cui sono stati suggeriti nelle risposte. Ho già esaminato entrambi, ma per quanto posso dire, si basano sull'indicizzazione delle parole , escludendo le parole di arresto e facendo ogni sorta di cose sensibili per una vera ricerca a tutto campo. Tuttavia questo non è adatto, perché potrei essere alla ricerca di un termine di ricerca come "oison" che deve corrispondere a "Roisonic Street" e "Poison-Ivy". La differenza chiave qui è che il termine di ricerca è solo un frammento del contenuto della colonna, che non deve essere delimitato da caratteri speciali o spazi bianchi.
EDIT2: [aggiunta un po 'di informazioni di sfondo:] della funzione richiesta che deve essere attuata sulla base di questo è una ricerca molto allentato per le descrizioni degli oggetti in un sistema di gestione delle merci. Gli utenti spesso non conoscono il numero corretto dell'articolo, ma solo una parte del nome dell'articolo. Sfortunatamente la qualità di queste descrizioni è piuttosto bassa, provengono da un sistema legacy e non possono essere modificati facilmente. Se per esempio le persone cercavano un maglio, sarebbero entrati nella "slitta". Con un indice basato su parola/token questo non troverà corrispondenze che vengono memorizzate come "martello", ma solo quelle che ascoltano "slittaio". Ci sono tutti i tipi di strane varianze che devono essere coperte, rendendo impraticabile un approccio basato su token.
Attualmente l'unica cosa che possiamo fare è una query LIKE '%searchterm%'
, che disabilita in modo efficace qualsiasi utilizzo di indice e richiede molte risorse e tempo. Idealmente, qualsiasi strumento di questo tipo creerebbe un indice che mi permettesse di ottenere risultati per query simili molto rapidamente, così da poter implementare una ricerca simile a un riflettore, recuperando solo i dati "reali" dalla tabella MySQL tramite la chiave primaria quando un utente sceglie un record di risultati.
Se possibile, l'indice deve essere aggiornabile (senza richiedere una ricostruzione completa), poiché i dati potrebbero cambiare e dovrebbero essere disponibili per la ricerca immediatamente da altri client.
Sarei felice di ricevere consigli e/o rapporti di esperienza.
Edit3: soluzione commerciale ha rilevato che "solo funziona" Anche se ho avuto un sacco di buone risposte a questa domanda, ho voluto da notare qui, che alla fine siamo andati con un prodotto commerciale chiamato "QuickFind" , prodotto e venduto da un'azienda tedesca denominata "HMB Datentechnik". Si prega di notare che io sono non affiliato con loro in alcun modo, perché potrebbe apparire così quando andrò e descrivere ciò che il loro prodotto può fare. Sfortunatamente il loro website sembra piuttosto male ed è solo tedesco, ma il prodotto in sé è davvero eccezionale. Al momento ho una versione di prova da loro - dovrete contattarli, nessun download - e sono estremamente colpito.
Dato che non esiste una documentazione completa disponibile online, cercherò di descrivere le mie esperienze fino ad ora.
Quello che fanno è creare un file indice personalizzato basato sul contenuto del database. Possono integrarsi tramite ODBC, ma da quello che mi viene detto raramente i clienti lo fanno. Invece - e questo è quello che probabilmente faremo - genererai un'esportazione di testo (come CSV) dal tuo database principale e lo invierai al loro indicizzatore. Ciò consente di essere completamente indipendenti dalla struttura della tabella effettiva (o da qualsiasi database SQL); infatti esportiamo dati uniti da più tabelle. Gli indici possono essere aggiornati in modo incrementale in un secondo momento.
Sulla base del fatto che il loro server (solo 250kb circa, in esecuzione come app per console o servizio Windows) serve listener per query su una porta TCP. Il protocollo è basato sul testo e sembra un po '"vecchio", ma è semplice e funziona. Fondamentalmente si passa solo a quale degli indici disponibili si desidera interrogare e ai termini di ricerca (frammenti), delimitato dallo spazio. Sono disponibili tre formati di output, array HTML/JavaScript, XML o CSV. Attualmente sto lavorando su un wrapper Java per il protocollo un po 'datato. Ma i risultati sono fantastici: attualmente ho un set di dati di esempio di circa 500.000 record con 8 colonne indicizzate e la mia applicazione di test attiva una ricerca su tutte le 8 colonne per i contenuti di un JTextField su ogni sequenza di tasti durante la modifica e può aggiornare il visualizzazione dei risultati (JTable) in tempo reale! Questo accade senza passare all'istanza MySQL da cui originariamente provenivano i dati. Sulla base delle colonne che si ottengono, è possibile chiedere il record "originale" interrogando MySQL con la chiave primaria di quella riga (è necessario che sia inclusa nell'indice QuickFind, ovviamente).
L'indice rappresenta circa il 30-40% delle dimensioni della versione di esportazione del testo dei dati. L'indicizzazione era principalmente legata alla velocità di I/O del disco; i miei 500.000 record hanno richiesto circa un minuto o due per essere elaborati.
È difficile descriverlo perché ho trovato persino difficile da credere quando ho visto una demo di prodotto in-house. Presentarono un database di indirizzi di 10 milioni di righe e cercarono frammenti di nomi, indirizzi e numeri di telefono e quando si toccò il pulsante "Cerca", i risultati tornarono in meno di un secondo - il tutto fatto su un notebook! Da quello che mi è stato detto, spesso si integrano con i sistemi SAP o CRM per migliorare i tempi di ricerca quando gli agenti dei call center capiscono solo i frammenti dei nomi o degli indirizzi di un chiamante.
Quindi, in ogni caso, probabilmente non riuscirò a descriverlo. Se hai bisogno di qualcosa del genere, dovresti assolutamente controllare questo. Google Translate fa un lavoro abbastanza buono che traduce il loro sito web dal tedesco all'inglese, quindi questo potrebbe essere un buon inizio.
aggiunto un paragrafo dopo i primi suggerimenti, facendo riferimento agli strumenti di ricerca di testo completo. spero che questo chiarisca il mio problema. –
Aggiunto un altro paragrafo con più sfondo –
lucene fa corrispondenze sottostringhe ... – Stobor