Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否将搜索字符串转换为与全文兼容的搜索字符串?_C#_Sql Server_Search_Full Text Search - Fatal编程技术网

C# 是否将搜索字符串转换为与全文兼容的搜索字符串?

C# 是否将搜索字符串转换为与全文兼容的搜索字符串?,c#,sql-server,search,full-text-search,C#,Sql Server,Search,Full Text Search,我正在使用MSSQL 2008的全文搜索引擎,它需要这样的搜索字符串: ("keyword1" AND "keyword2*" OR "keyword3") engine 2009 "san francisco" hotel december xyz stuff* "in miami" 1234 something or "something else" 我的用户正在输入以下内容: ("keyword1" AND "keyword2*" OR "keyword3") engin

我正在使用MSSQL 2008的全文搜索引擎,它需要这样的搜索字符串:

("keyword1" AND "keyword2*" OR "keyword3")
engine 2009
"san francisco"     hotel december xyz
stuff* "in miami"   1234
something or "something else"
我的用户正在输入以下内容:

("keyword1" AND "keyword2*" OR "keyword3")
engine 2009
"san francisco"     hotel december xyz
stuff* "in miami"   1234
something or "something else"
我正在尝试将这些字符串转换为与全文引擎兼容的字符串,如下所示:

("engine" AND "2009")
("san francisco" AND "hotel" AND "december" AND "xyz")
("stuff*" "in miami" "1234")
("something" OR "something else")
我很难做到这一点,试着用引号、空格和插入等方法来计算。但是我的代码看起来很糟糕,如果呕吐的话

有人能帮忙吗?

给你:

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();
}
}
类程序{
静态void Main(字符串[]参数){
//设置一些测试表达式
List searchExpressions=新列表(新字符串[]{
“引擎2009”,
“\“旧金山\”酒店十二月xyz”,
迈阿密“1234”的“stuff*\”,
“某物”或“其他某物”
});
//显示并解析每个表达式
foreach(searchExpressions中的字符串searchExpression){
Console.WriteLine(string.Concat(
“用户输入:”,搜索表达式,
“\r\n\tSql表达式:”,ParseSearchExpression(searchExpression),
“\r\n”);
}
Console.ReadLine();
}
私有静态字符串ParseSearchExpression(字符串searchExpression){
//将引号中存在的所有“空格字符”替换为字符0
字符串temp=Regex.Replace(searchExpression,@““[^”“]”+”,(MatchEvaluator)委托(匹配m){
返回Regex.Replace(m.Value,@“[\s]”,“\x00”);
});
//拆分任意空格字符上的字符串(因此:将不拆分带引号的项)
string[]tokens=Regex.Split(temp,@“[”“\s]+”,RegexOptions.IgnoreCase| RegexOptions.ExplicitCapture);
//产生结果
StringBuilder结果=新建StringBuilder();
string tokenLast=string.Empty;
foreach(令牌中的字符串令牌){
如果(token.Length>0){
如果((token.Length>0)&(!token.Equals(“AND”,StringComparison.OrdinalIgnoreCase))){
如果(result.Length>0){
result.Append(tokenLast.Equals(“OR”,StringComparison.OrdinalIgnoreCase)?“OR”:“AND”);
}
result.Append(“\”).Append(token.Replace(“\”,“\”).Replace(“\x00”,”).Append(“\”);
}
tokenLast=令牌;
}
}
如果(result.Length>0){
结果。插入(0,“(”)。追加(“)”;
}
返回result.ToString();
}
}

请不要为你的问题添加标签
mssql
。你在这里已经足够了解了。你打算在哪里处理这个问题?如果是C#,请使用
String。拆分
并适当地连接内容…几乎完美,除了搜索词中的“and”之外。因此:something和“something other”将变成某物“和”和“和”以及“其他东西”。不应该搜索“和”,就像不搜索“或”一样。只需将行“if(token.Length>0){”修改为“if((token.Length>0)&(!token.Equals(“AND”,StringComparison.OrdinalIgnoreCase)){:)