【问题标题】:Transform Search String into FullText Compatible Search String?将搜索字符串转换为全文兼容的搜索字符串?
【发布时间】:2011-02-22 03:53:18
【问题描述】:

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

("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")

我对此感到非常困难,尝试使用计数引号、空格和插入等来做到这一点,但我的代码看起来像可怕的 for-and-if 呕吐物。

有人可以帮忙吗?

【问题讨论】:

  • 请不要标记您的问题mssql。你已经在这里足够了解了。
  • 您打算在哪里处理这个问题?如果是 C#,请使用 String.split 并适当地连接内容...

标签: c# sql-server search full-text-search


【解决方案1】:

给你:

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();
}
}

【讨论】:

  • 几乎完美,除了“and”在搜索词中的情况。所以这个:something and "something else" 将变成 "something" AND "and" AND "something else"。不应搜索“and”,就像不搜索“or”一样。
  • 只需将“if (token.Length > 0) {”这一行修改为“if ((token.Length > 0) && (!token.Equals("AND", StringComparison.OrdinalIgnoreCase)) ) {" :)
猜你喜欢
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2021-03-26
相关资源
最近更新 更多