C# 是否将搜索字符串转换为与全文兼容的搜索字符串?
我正在使用MSSQL 2008的全文搜索引擎,它需要这样的搜索字符串: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
("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)){:)