Saya tidak mendapatkan pencarian teks lengkap yang saya inginkan, dan saya tidak mengerti perbedaan dalam daftar hasil.
Pernyataan contoh:
SELECT `meldungstext`
FROM `artikel`
WHERE `meldungstext` LIKE '%punkt%'
mengembalikan 92 baris. Saya menerima baris yang memiliki kecocokan, misalnya, seperti "Punkten", "Zwei-Punkte-Vorsprung" dan "Treffpunkt" di kolom meldungstext.
Saya menetapkan indeks teks lengkap pada kolom "meldungstext" dan mencoba ini:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*')
ini hanya mengembalikan 8 baris. Saya hanya menerima baris yang cocok dengan "Punkt" itu sendiri atau kata-kata yang saya pikir diambil sebagai "Punkt" seperti dalam "i-Punkt".
Saya kemudian mencoba mode boolean:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*' IN BOOLEAN MODE)
mengembalikan 44 baris. Saya menerima baris yang memiliki "Zwei-Punkte-Vorsprung" atau "Treffpunkt" di kolom meldungstext, tetapi bukan yang dengan "Punkten".
Mengapa ini terjadi dan bagaimana saya bisa mengatur pencarian teks lengkap yang "sepenuhnya" berfungsi untuk mencegah penggunaan LIKE '%%' di mana-klausa?
sumber
Jawaban:
Saya mengambil tiga string dalam pertanyaan Anda dan menambahkannya ke sebuah meja ditambah tiga string dengan
pankt
alih - alihpunkt
.Berikut ini dieksekusi menggunakan MySQL 5.5.12 untuk Windows
Saya menjalankan pertanyaan ini di atas meja menggunakan 3 pendekatan berbeda
MATCH ... AGAINST
LOCATE
seperti pada fungsi LOCATELIKE
Harap perhatikan perbedaannya
Semua nilai PunktMatch harus berupa lebah 1 1 dan 3 0.
Sekarang perhatikan saya meminta mereka seperti biasa
OK menggunakan MATCH .. MELAWAN dengan punkt tidak berfungsi. Bagaimana dengan pankt ???
Mari kita jalankan
GROUP BY
permintaan besar saya terhadap panktIni salah juga karena saya akan melihat 3 0 dan 3 1 untuk PanktMatch.
Saya mencoba sesuatu yang lain
Saya menambahkan tanda plus ke pankt dan saya mendapat hasil berbeda. Apa 2 dan bukan 3 ???
Menurut Dokumentasi MySQL , perhatikan apa yang dikatakannya tentang karakter wildcard:
Berdasarkan ini, karakter wildcard berlaku untuk bagian belakang token dan bukan untuk bagian depan. Sehubungan dengan ini, output harus benar karena 2 dari 3 token punkt. Kisah yang sama dengan pankt. Setidaknya ini menjelaskan mengapa 2 dari 3 dan mengapa lebih sedikit baris.
sumber
COUNT(IF(MATCH
permintaan.COUNT(…)
kolom PunktMatch dan PanktMatch?COUNT(IF(MATCH (
meldungstext) AGAINST ('*pankt*' IN BOOLEAN MODE),1,0))
akan selalu menghasilkan1
, karena ia menghitung1
atau0
, hasil dariIF(…)
.