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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top