public static void Main()
string clearedText = "deneme yazisi go mongo";
string searchTextAnd = "go&&mongo";
string searchTextOr = "yazisi||sdfsdfsdf";
string searchTextOther = "ali&&ata&&bak";
if(ContainsAny(clearedText,searchTextAnd,100))
Console.WriteLine("text search is found(AND)");
Console.WriteLine("text search is not found(AND)");
if(ContainsAny(clearedText,searchTextOr,100))
Console.WriteLine("text search is found(OR)");
Console.WriteLine("text search is not found(OR)");
if(ContainsAny(clearedText,searchTextOther,100))
Console.WriteLine("searchTextOther is found");
Console.WriteLine("searchTextOther is not found");
public static readonly double mWeightThreshold = 0.7;
public static readonly int mNumChars = 4;
public static bool ContainsAny(string text, string formatedSearchText, int similarity)
if (string.IsNullOrEmpty(text) || string.IsNullOrEmpty(formatedSearchText))
string[] formatedTextArr = formatedSearchText.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
foreach (string formatedTex in formatedTextArr)
string[] searchMainArr = formatedTex.Split(new string[] { "&&" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string searchTextPart in searchMainArr)
string[] searchArr = searchTextPart.Split(new string[] { "||" }, StringSplitOptions.RemoveEmptyEntries);
bool innerResult = false;
foreach (string searchItem in searchArr)
if (Contains(text,searchItem, similarity))
if (result.HasValue == false)
result = result.Value && innerResult;
if (result.Value == false)
if (result.Value == true)
public static bool Contains(string source, string search, int similarity)
if (string.IsNullOrEmpty(source) || string.IsNullOrEmpty(search))
if (source.IndexOf(search, StringComparison.InvariantCultureIgnoreCase) != -1)
if (source.Length == search.Length)
result = Similarity(source, search) >= similarity;
for (int m = 0; result == false && m <= source.Length - search.Length; m++)
string subword = source.Substring(m, search.Length);
if (Similarity(subword, search) >= similarity)
public static double Similarity(string aString1, string aString2)
return (Proximity(aString1, aString2) * 100.0);
public static double Proximity(string aString1, string aString2)
int lLen1 = aString1.Length;
int lLen2 = aString2.Length;
return lLen2 == 0 ? 1.0 : 0.0;
int lSearchRange = Math.Max(0, Math.Max(lLen1, lLen2) / 2 - 1);
bool[] lMatched1 = new bool[lLen1];
bool[] lMatched2 = new bool[lLen2];
for (int i = 0; i < lLen1; ++i)
int lStart = Math.Max(0, i - lSearchRange);
int lEnd = Math.Min(i + lSearchRange + 1, lLen2);
for (int j = lStart; j < lEnd; ++j)
if (lMatched2[j]) continue;
if (aString1[i] != aString2[j])
if (lNumCommon == 0) return 0.0;
int lNumHalfTransposed = 0;
for (int i = 0; i < lLen1; ++i)
if (!lMatched1[i]) continue;
while (!lMatched2[k]) ++k;
if (aString1[i] != aString2[k])
int lNumTransposed = lNumHalfTransposed / 2;
double lNumCommonD = lNumCommon;
double lWeight = (lNumCommonD / lLen1
+ (lNumCommon - lNumTransposed) / lNumCommonD) / 3.0;
if (lWeight <= mWeightThreshold) return lWeight;
int lMax = Math.Min(mNumChars, Math.Min(aString1.Length, aString2.Length));
while (lPos < lMax && aString1[lPos] == aString2[lPos])
if (lPos == 0) return lWeight;
return lWeight + 0.1 * lPos * (1.0 - lWeight);