Frage

Ich baue eine grundlegende Suchfunktion mit LIKE auf (ich würde Volltext verwenden, kann dies aber im Moment nicht) und frage mich, ob MySQL dies kann, wenn ich nach einem Schlüsselwort suche (z. B.WHERE-Feld LIKE '%word%') ebenfalls 20 Wörter auf beiden Seiten des Schlüsselworts zurückgeben?

War es hilfreich?

Lösung

Sie können alles in der Abfrage mit SUBSTRING_INDEX erledigen

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
    )
)

)

Andere Tipps

Verwenden Sie die Funktion INSTR(), um die Position des Worts in der Zeichenfolge zu ermitteln, und verwenden Sie dann die Funktion SUBSTRING(), um einen Teil der Zeichen vor und nach der Position auszuwählen.

Sie müssen darauf achten, dass Ihre SUBSTRING-Anweisung keine negativen Werte verwendet, sonst erhalten Sie seltsame Ergebnisse.

Probieren Sie es aus und melden Sie sich wieder.

Ich glaube nicht, dass es möglich ist, die Anzahl der zurückgegebenen Wörter zu begrenzen, aber um die Anzahl der zurückgegebenen Zeichen zu begrenzen, könnten Sie so etwas tun

SELECT SUBSTRING(field_name, LOCATE('keyword', field_name) - chars_before, total_chars) FROM table_name WHERE field_name LIKE "%keyword%"
  • chars_before - ist die Anzahl der Zeichen, die Sie vor den Schlüsselwörtern auswählen möchten (n)
  • Total_chars - ist die Gesamtzahl der Zeichen, die Sie auswählen möchten

d.h.Das folgende Beispiel würde 30 Zeichen Daten zurückgeben, beginnend mit 15 Zeichen vor dem Schlüsselwort

SUBSTRING(field_name, LOCATE('keyword', field_name) - 15, 30)

Notiz:Wie aryeh betonte, stören alle negativen Werte in SUBSTRING() die Sache erheblich – wenn das Schlüsselwort beispielsweise innerhalb der ersten [chars_before] Zeichen des Felds gefunden wird, werden die letzten [chars_before] Zeichen der Daten im Feld zurückgegeben.

Meiner Meinung nach ist es am besten, das Ergebnis über eine SQL-Abfrage zu erhalten und programmgesteuert einen regulären Ausdruck anzuwenden, der es Ihnen ermöglicht, eine Gruppe von Wörtern vor und nach dem gesuchten Wort abzurufen.

Ich kann es jetzt nicht testen, aber der reguläre Ausdruck sollte etwa so aussehen:

.*(\w+)\s*WORD\s*(\w+).*

wo Sie ersetzen WORD für das gesuchte Wort und verwenden Sie die Regex-Gruppe 1 als Vorwörter und 2 als Nachwörter

Ich werde es später testen, wenn ich fragen kann RegexBuddy ob es klappt :) und ich werde es hier posten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top