Kod: Tümünü seç
Select Top 400 * From Cevap
Where ID>0
and Contains(Cevap, '*Allah* or *Allahın* or *Allah''ın* or *isimleri* or *nelerdir* or *Allah isimleri nelerdir* or *Allah''ın isimleri nelerdir*')
Yani kural şöyle olmalı kanımca;
1- İlk kayıtlarda öncelikle anlam olarak benzer olan kayıtların listelenmesi
2- Sonraki kayıtlarda her kelimeyi içeren kayıtların listelenmesi
3- Sonraki kayıtlarda ise kelimelerden içeriğinde ki fazlalık durumuna göre listeleme
4- Sonraki kayıtlarda ise en az bir kelime olanları listeleme
Bunu SQL ile yapabileceğimiz bir sorgu olabileceğini sanmıyorum.
Kayıt içinde ki bilgileri bir memoya aldığımızda, ve döngüyle satr satır kontrol yaptığımızda şöyle bir fonksiyon ile benzerlik karşılaştırılması yapılabilir.
Kod: Tümünü seç
Function CumleBenzerlikOrani(s1, s2: string): Integer;
var
hit: Integer;
p1, p2: Integer;
l1, l2: Integer;
pt: Integer;
diff: Integer;
hstr: string;
test: array [1 .. 255] of Boolean;
begin
if Length(s1) < Length(s2) then
begin
hstr := s2;
s2 := s1;
s1 := hstr;
end;
l1 := Length(s1);
l2 := Length(s2);
p1 := 1;
p2 := 1;
hit := 0;
diff := Max(l1, l2) div 3 + ABS(l1 - l2);
for pt := 1 to l1 do
test[pt] := False;
repeat
if not test[p1] then
begin
if (s1[p1] = s2[p2]) and (ABS(p1 - p2) <= diff) then
begin
test[p1] := True;
Inc(hit);
Inc(p1);
Inc(p2);
if p1 > l1 then
p1 := 1;
end
else
begin
test[p1] := False;
Inc(p1);
if p1 > l1 then
begin
while (p1 > 1) and not(test[p1]) do
Dec(p1);
Inc(p2)
end;
end;
end
else
begin
Inc(p1);
if p1 > l1 then
begin
repeat
Dec(p1);
until (p1 = 1) or test[p1];
Inc(p2);
end;
end;
until p2 > Length(s2);
Result := 100 * hit DIV l1;
end;
Kod: Tümünü seç
var
Oran:Integer;
begin
....döngü
Oran:=CumleBenzerlikOrani(Memo1.Items.Strings[I] , Aranan );
end;
Hiç döngülere girmeden kullanıcı kullanım performansının verimli olması bakımından bunun SQL ile yapılabilmesi mümkün müdür ? Eğer değilse bu kodlamayı kullanıcının verimli kullanımın yüksek olabilecek şekilde en mantıklı nasıl modelleyebilirim ?
Şimdiden teşekkürler,