Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Firebird Sound_ex Kodu.
#1
Soundex % lik Benzeşme ile aranan metnin bulunan metne % x miktarda benzemesiyole filtre içine dahil oluyor.
SET TERM ^ ;

CREATE PROCEDURE SP_SOUND_EX (
 ARA VARCHAR(30),
 BUL VARCHAR(30),
 OUT BENZESME_TRK INT,
 OUT BENZESME_ENG INT
)
AS
DECLARE VARIABLE ARA_SOUND VARCHAR(30);
DECLARE VARIABLE BUL_SOUND VARCHAR(30);
DECLARE VARIABLE I INT;
DECLARE VARIABLE HARF VARCHAR(1);
DECLARE VARIABLE COUNT_ARA INT;
DECLARE VARIABLE COUNT_BUL INT;

BEGIN
 ARA_SOUND = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(ARA, 'Ğ', 'G'), 'Ü', 'U'), 'İ', 'I'), 'Ş', 'S'), 'Ö', 'O'), 'Ç', 'C');
 BUL_SOUND = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(BUL, 'Ğ', 'G'), 'Ü', 'U'), 'İ', 'I'), 'Ş', 'S'), 'Ö', 'O'), 'Ç', 'C');

 IF (ARA = BUL) THEN
   BENZESME_TRK = 100;
 ELSE IF (ABS(CHAR_LENGTH(BUL) - CHAR_LENGTH(ARA)) > CHAR_LENGTH(ARA) / 2) THEN
   BENZESME_TRK = 0;
 ELSE
 BEGIN
   I = 1;
   WHILE (I <= CHAR_LENGTH(ARA)) DO
   BEGIN
     HARF = SUBSTRING(ARA FROM I FOR 1);
     INSERT INTO HARFT (STRING, HARF) VALUES (:ARA, :HARF);
     I = I + 1;
   END

   I = 1;
   WHILE (I <= CHAR_LENGTH(BUL)) DO
   BEGIN
     HARF = SUBSTRING(BUL FROM I FOR 1);
     INSERT INTO HARFT (STRING, HARF) VALUES (:BUL, :HARF);
     I = I + 1;
   END

   SELECT
     COALESCE(BUL.ASAY, 0) AS ARASAY,
     COALESCE(STRING.BULSAY, 0) AS BULSAY
   FROM
     (SELECT STRING, HARF, COUNT(*) AS ASAY
      FROM HARFT
      WHERE STRING = :ARA
      GROUP BY STRING, HARF) BUL
   FULL OUTER JOIN
     (SELECT STRING, HARF, COUNT(*) AS BULSAY
      FROM HARFT
      WHERE STRING = :BUL
      GROUP BY STRING, HARF) STRING
   ON STRING.HARF = BUL.HARF
   INTO :COUNT_ARA, :COUNT_BUL;

   BENZESME_TRK = CASE
     WHEN COUNT_ARA = COUNT_BUL THEN 100
     WHEN COUNT_ARA > 0 AND COUNT_BUL > 0 THEN 75
     ELSE 0
   END + IIF(SUBSTRING(ARA FROM 1 FOR 1) = SUBSTRING(BUL FROM 1 FOR 1), 25, 0)
        + IIF(SUBSTRING(ARA FROM CHAR_LENGTH(ARA) FOR 1) = SUBSTRING(BUL FROM CHAR_LENGTH(BUL) FOR 1), 15, 0);

   BENZESME_TRK = BENZESME_TRK / CAST(COUNT(*) AS FLOAT) * 100;
 END

 BENZESME_ENG = BENZESME_TRK; -- Basit bir benzerlik sağlamak için aynı değeri kullanabilirsiniz

 SUSPEND;
END^

SET TERM ; ^

// -------- Kullanımı  Delphi Tarafında -------------

var
  Query: TSQLQuery;
  DataSource: TDataSource;
  DBGrid: TDBGrid;

begin
  Query := TSQLQuery.Create(nil);
  DataSource := TDataSource.Create(nil);
  DBGrid := TDBGrid.Create(nil);

  try
    Query.SQLConnection := // Set your SQL connection here

    Query.SQL.Text := 'EXECUTE PROCEDURE SP_SOUND_EX (:ARA, :BUL, :BENZESME_TRK, :BENZESME_ENG)';
    Query.ParamByName('ARA').AsString := 'SADULLAH';
    Query.ParamByName('BUL').AsString := 'ABDULLAH';
    Query.ParamByName('BENZESME_TRK').ParamType := ptOutput;
    Query.ParamByName('BENZESME_ENG').ParamType := ptOutput;

    DataSource.DataSet := Query;
    DBGrid.DataSource := DataSource;

    Query.Open;
    try
      while not Query.Eof do
      begin
        // BENZESME_TRK değerini kontrol ederek %70 ve üzeri benzeme oranına sahip kayıtları filtreleyebilirsiniz.
        if Query.FieldByName('BENZESME_TRK').AsInteger >= 70 then  // <---örnek = %70-- Benzeşme Oranı Buradan ayarlanmış.
        begin
          // İstediğiniz işlemleri gerçekleştirin veya sadece DBGrid'e ekleyin
          DBGrid.DataSource.DataSet.Append;
          DBGrid.DataSource.DataSet.FieldByName('ARA').AsString := Query.FieldByName('ARA').AsString;
          DBGrid.DataSource.DataSet.FieldByName('BUL').AsString := Query.FieldByName('BUL').AsString;
          DBGrid.DataSource.DataSet.Post;
        end;

        Query.Next;
      end;
    finally
      Query.Close;
    end;
  finally
    Query.Free;
    DataSource.Free;
    DBGrid.Free;
  end;
end;


//--------------------------------------------------------

[ars=delphi]Query.SQL.Text := 'EXECUTE PROCEDURE SP_SOUND_EX (:ARA, :BUL, :BENZESME_TRK, :BENZESME_ENG)';
Query.ParamByName('ARA').AsString := 'SADULLAH';
Query.ParamByName('BUL').AsString := 'ABDULLAH';
Query.ParamByName('BENZESME_TRK').ParamType := ptOutput;
Query.ParamByName('BENZESME_ENG').ParamType := ptOutput;
Query.ExecSQL;

ShowMessage('Türkçe Benzerlik: ' + Query.ParamByName('BENZESME_TRK').AsString);
ShowMessage('İngilizce Benzerlik: ' + Query.ParamByName('BENZESME_ENG').AsString);


Zamanım olmadığı için Denemedim.
__________________________
From Now I will only Reading.
Cevapla
#2
Interbase de çalıştırdıım.. Hata verdi.....Fİrebird de yazılmış olan bir procedure galiba...
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Photo Firebird de Aynı sorgulama Mantığında Hata !! maydin60 3 500 19-06-2026, Saat: 05:44
Son Yorum: emailx45
  firebird bağlantı hatası. Kamuran Alpkaya 17 19.927 06-08-2025, Saat: 14:20
Son Yorum: mcuyan
  FIREBIRD SIRALAMA Kral 10 2.425 15-10-2024, Saat: 19:04
Son Yorum: Kral
  Firebird bağlantı kopmaları (ZeosLib) boreas 0 871 12-06-2024, Saat: 16:08
Son Yorum: boreas
  Firebird Database Create Doğru mu? Altıner 2 1.485 02-05-2024, Saat: 11:00
Son Yorum: hi_selamlar



Konuyu Okuyanlar: 1 Ziyaretçi