2010-05-21 17 views
7

böyle bir arama dizesi: BöyleArama Dizesini FullText Uyumlu Arama Dizgisi'ne Dönüştürün? Ben bekliyor MSSQL 2008 Tam metin arama motoru ile çalışıyorum

("keyword1" AND "keyword2*" OR "keyword3") 

Benim kullanıcıların giriyoruz şeyler:

engine 2009 
"san francisco"  hotel december xyz 
stuff* "in miami" 1234 
something or "something else" 

Ben dönüştürmeye çalışıyorum Bu gibi bu tam metin motoruna uyumlu dizeleri:

("engine" AND "2009") 
("san francisco" AND "hotel" AND "december" AND "xyz") 
("stuff*" "in miami" "1234") 
("something" OR "something else") 

Ben, sayma tırnak işareti kullanarak yapıyor çalıştı, bununla gerçekten zor bir zaman var boşluklar ve ekleme vb. ama kodum için-ve-eğer kusmuk gibi korkunç görünüyor.

Birisi yardımcı olabilir mi? İşte

+1

sorunuzu 'mssql' etiketlemek etmeyin. Daha iyi bilmek için buralarda oldun. –

+0

Bunu nerede ele almayı planlıyorsunuz? C#, 'String.split' kullanın ve içeriğini uygun şekilde birleştirin ... –

cevap

6

gitmek:

class Program { 
    static void Main(string[] args) { 
     // setup some test expressions 
     List<string> searchExpressions = new List<string>(new string[] { 
      "engine 2009", 
      "\"san francisco\"  hotel december xyz", 
      "stuff* \"in miami\" 1234 ", 
      "something or \"something else\"" 
     }); 

     // display and parse each expression 
     foreach (string searchExpression in searchExpressions) { 
      Console.WriteLine(string.Concat(
       "User Input: ", searchExpression, 
       "\r\n\tSql Expression: ", ParseSearchExpression(searchExpression), 
       "\r\n")); 
     } 

     Console.ReadLine(); 

    } 

private static string ParseSearchExpression(string searchExpression) { 
    // replace all 'spacecharacters' that exists within quotes with character 0 
    string temp = Regex.Replace(searchExpression, @"""[^""]+""", (MatchEvaluator)delegate(Match m) { 
     return Regex.Replace(m.Value, @"[\s]", "\x00"); 
    }); 

    // split string on any spacecharacter (thus: quoted items will not be splitted) 
    string[] tokens = Regex.Split(temp, @"[""\s]+", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture); 

    // generate result 
    StringBuilder result = new StringBuilder(); 
    string tokenLast = string.Empty; 
    foreach (string token in tokens) { 
     if (token.Length > 0) { 
      if ((token.Length > 0) && (!token.Equals("AND", StringComparison.OrdinalIgnoreCase))) { 
       if (result.Length > 0) { 
        result.Append(tokenLast.Equals("OR", StringComparison.OrdinalIgnoreCase) ? " OR " : " AND "); 
       } 
       result.Append("\"").Append(token.Replace("\"", "\"\"").Replace("\x00", " ")).Append("\""); 
      } 
      tokenLast = token; 
     } 
    } 
    if (result.Length > 0) { 
     result.Insert(0, "(").Append(")"); 
    } 

    return result.ToString(); 
} 
} 
+0

Arama teriminde" ve "nin bulunduğu durum haricinde neredeyse mükemmel. Yani bu: bir şey ve "başka bir şey", "bir şey" VE "VE" VE "başka bir şeye" dönüşecek. "Ve" nin aranmaması gerekir, tıpkı "veya" gibi aranmaz. – Alex

+0

sadece "if (token.Length> 0) {" to "satırını değiştirirseniz ((token.Length> 0) && (! Token.Equals (" AND ", StringComparison.OrdinalIgnoreCase))) {" :) –