"Bunu mu demek istediniz"

4 Cevap php

Ben bir ~ 300.000 satırlık bir tablo var; hangi teknik terimleri içerir; PHP ve MySQL + FULLTEXT indeksleri kullanılarak sorgulanır. Ama ne zaman ben yanlış bir yazılı dönem arıyor; Örneğin "hyperpext" için; doğal sonucu veriyor.

Ben küçük bir yazı hataları "kompanse" ve veritabanı yakın kaydı almak gerekir. Ben nasıl böyle Feaure başarabilirsiniz? Ben Levenshtein mesafe, Soundex ve metaphone algoritmalar ancak şu anda veritabanına karşı sorguladığınız bu uygulamak için sağlam bir fikir olmamasından hakkında (aslında, bugün öğrendim) biliyorum.

Best regards. (Sorry about my poor English, I'm trying to do my best)

4 Cevap

Nasıl olabilir implement Levenshtein distance in a MySQL stored function için bu makaleye bakın.

Kuşaklar için, yazarın öneri bunu yapmak için:

CREATE FUNCTION LEVENSHTEIN (s1 VARCHAR(255), s2 VARCHAR(255))
  RETURNS INT
    DETERMINISTIC
      BEGIN
        DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
        DECLARE s1_char CHAR;
        DECLARE cv0, cv1 VARBINARY(256);
        SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0;
        IF s1 = s2 THEN
          RETURN 0;
        ELSEIF s1_len = 0 THEN
          RETURN s2_len;
        ELSEIF s2_len = 0 THEN
          RETURN s1_len;
        ELSE
          WHILE j <= s2_len DO
            SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
          END WHILE;
          WHILE i <= s1_len DO
            SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
            WHILE j <= s2_len DO
                SET c = c + 1;
                IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF;
                SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
                IF c > c_temp THEN SET c = c_temp; END IF;
                SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
                IF c > c_temp THEN SET c = c_temp; END IF;
                SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
            END WHILE;
            SET cv1 = cv0, i = i + 1;
          END WHILE;
        END IF;
        RETURN c;
      END

O da farklı / toplam karakter oranı, yerine düz bir düzenleme mesafe değerlendirecek bir LEVENSHTEIN_RATIO yardımcı yöntem sağlar. Örneğin,% 60 ise, o kaynak kelimesindeki karakterlerin beşte üç hedef kelime farklıdır.

CREATE FUNCTION LEVENSHTEIN_RATIO (s1 VARCHAR(255), s2 VARCHAR(255))
  RETURNS INT
    DETERMINISTIC
      BEGIN
        DECLARE s1_len, s2_len, max_len INT;
        SET s1_len = LENGTH(s1), s2_len = LENGTH(s2);
        IF s1_len > s2_len THEN SET max_len = s1_len; ELSE SET max_len = s2_len; END IF;
        RETURN ROUND((1 - LEVENSHTEIN(s1, s2) / max_len) * 100);
      END

http://dev.mysql.com/doc/refman/5.0/en/udf-compiling.html yorumlarından

now i download the package from the mysql udf repository http://empyrean.lib.ndsu.nodak.edu/~nem/mysql/

wget http://empyrean.lib.ndsu.nodak.edu/~nem/mysql/udf/dludf.cgi?ckey=28

ll

tar -xzvf dludf.cgi\?ckey\=28

gcc -shared -o libmysqllevenshtein.so mysqllevenshtein.cc -I/usr/include/mysql/

mv libmysqllevenshtein.so /usr/lib

mysql -uroot -pPASS

mysql> use DATABASE

mysql> CREATE FUNCTION levenshtein RETURNS INT SONAME 'libmysqllevenshtein.so';

mysql> select levenshtein(w1.word,w2.word) as dist from word w1, word w2 where ETC........... order by dist asc limit  0,10;

Ben önermek sorgu girişi tarihinde generate typo varyasyonları.

yani hyperpext> {hyperpeext, hipertext, vb ...}

Bunlardan biri (özellikle ortak imla hataları için) doğru yazım olacağı kesindir

Eğer büyük olasılıkla tespit maç yolu size dönem belge sıklığını belirten bir dizin üzerinde her biri için bir arama yapmaktır. (Mantıklı?)

Neden kendi alternatif sözcüğü (örneğin, Soundex) form depolamak için bir tablo sütunu eklemek değil mi? İlk SEÇ tam eşleşme bulmak yoksa bu şekilde, size alternatif formları eşleşen aramak için ikinci bir arama yapabilirsiniz.

Hüner Yanlış yazılmış varyasyonları aynı alternatif forma dönüştürülür sonuna kadar böylece her kelimeyi kodlamak için olduğunu.