Selezione di X parole da un campo di testo in MySQL
-
09-06-2019 - |
Domanda
Sto creando una funzionalità di ricerca di base, utilizzando LIKE (utilizzare il testo completo ma al momento non posso) e mi chiedo se MySQL può, cercando una parola chiave (ad es.DOVE il campo LIKE '%word%') restituisce 20 parole su entrambi i lati della parola chiave?
Soluzione
Puoi fare tutto nella query utilizzando SUBSTRING_INDEX
CONCAT_WS(
' ',
-- 20 words before
TRIM(
SUBSTRING_INDEX(
SUBSTRING(field, 1, INSTR(field, 'word') - 1 ),
' ',
-20
)
),
-- your word
'word',
-- 20 words after
TRIM(
SUBSTRING_INDEX(
SUBSTRING(field, INSTR(field, 'word') + LENGTH('word') ),
' ',
20
)
)
)
Altri suggerimenti
Utilizzare la funzione INSTR() per trovare la posizione della parola nella stringa, quindi utilizzare la funzione SUBSTRING() per selezionare una porzione di caratteri prima e dopo la posizione.
Dovresti fare attenzione che le tue istruzioni SUBSTRING non utilizzino valori negativi o otterrai risultati strani.
Provalo e riferisci.
Non penso che sia possibile limitare il numero di parole restituite, tuttavia per limitare il numero di caratteri restituiti potresti fare qualcosa di simile
SELECT SUBSTRING(field_name, LOCATE('keyword', field_name) - chars_before, total_chars) FROM table_name WHERE field_name LIKE "%keyword%"
- Chars_before - è il numero di caratteri che si desidera selezionare prima delle parole chiave
- Total_Chars - è il numero totale di caratteri che si desidera selezionare
cioè.l'esempio seguente restituirebbe 30 caratteri di dati a partire da 15 caratteri prima della parola chiave
SUBSTRING(field_name, LOCATE('keyword', field_name) - 15, 30)
Nota:come ha sottolineato aryeh, qualsiasi valore negativo in SUBSTRING() complica notevolmente le cose: ad esempio se la parola chiave si trova all'interno dei primi [chars_before] caratteri del campo, vengono restituiti gli ultimi [chars_before] caratteri dei dati nel campo.
Penso che la soluzione migliore sia ottenere il risultato tramite query SQL e applicare un'espressione regolare in modo programmatico che ti consentirà di recuperare un gruppo di parole prima e dopo la parola cercata.
Non posso testarlo ora, ma l'espressione regolare dovrebbe essere qualcosa del tipo:
.*(\w+)\s*WORD\s*(\w+).*
dove sostituisci WORD
per la parola cercata e utilizzare il gruppo regex 1 come parole precedenti e 2 come parole successive
Lo proverò più tardi quando potrò chiedere al mio RegexBuddy se funzionerà :) e lo pubblicherò qui