Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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#字符串到SQL全文目录搜索?_C#_Sql Server_Full Text Search - Fatal编程技术网

如何:C#字符串到SQL全文目录搜索?

如何:C#字符串到SQL全文目录搜索?,c#,sql-server,full-text-search,C#,Sql Server,Full Text Search,我有一些搜索查询,如下所示: 乔治,而不是华盛顿或亚伯拉罕 狗或猫而不是狼 对于这些搜索,我想得到乔治或亚伯拉罕的搜索结果,但不是华盛顿等 基本上,我希望获取字符串并能够将上下文搜索提交到全文目录存储过程搜索 我想我应该使用正则表达式,但我对C#中的正则表达式非常不熟悉 我发现了这篇文章:我认为这是我需要做的,但我希望我能在实现方面得到一些帮助 假设将字符串作为参数并希望返回字符串: string input = 'George Washington AND NOT Martha OR Dog'

我有一些搜索查询,如下所示:

乔治,而不是华盛顿或亚伯拉罕

狗或猫而不是狼

对于这些搜索,我想得到乔治或亚伯拉罕的搜索结果,但不是华盛顿等

基本上,我希望获取字符串并能够将上下文搜索提交到全文目录存储过程搜索

我想我应该使用正则表达式,但我对C#中的正则表达式非常不熟悉

我发现了这篇文章:我认为这是我需要做的,但我希望我能在实现方面得到一些帮助

假设将字符串作为参数并希望返回字符串:

string input = 'George Washington AND NOT Martha OR Dog';

private string interpretSearchQuery(input)
{
     // HALP!

        /* replace ' AND ' | ' AND NOT ' with
         * " AND "
         * " AND NOT "
         * 
         * replace ' OR ' | ' OR NOT ' with
         * " OR "
         * " OR NOT "
         * 
         * add " to beginning of string and " to end of string
         */

     return '"George Washington" AND NOT "Martha" OR "Dog"';
}

我将使用(或波兰符号)解析您的字符串

因此,使用您的输入字符串:

乔治·华盛顿,而不是玛莎或 狗的

并将其简化为:

A = George 
B = Washington
C = Martha
D = Dog
& = AND
! = NOT
| = OR
我们将得到

AB&C!D|

这意味着:

  • 推送值A(乔治)
  • 推动价值B(华盛顿)
  • 通过弹出前两个值 并推动结果(乔治和 (华盛顿)
  • 推送值C(玛莎)
  • 不是通过弹出前两个值 并推动结果(乔治和 华盛顿)不是(玛莎)
  • 推送值D(狗)
  • 或者通过弹出前两个值 并推动结果((乔治和 华盛顿)不是(玛莎)或(狗)

  • 我将使用(或波兰符号)解析您的字符串

    因此,使用您的输入字符串:

    乔治·华盛顿,而不是玛莎或 狗的

    并将其简化为:

    A = George 
    B = Washington
    C = Martha
    D = Dog
    & = AND
    ! = NOT
    | = OR
    
    我们将得到

    AB&C!D|

    这意味着:

  • 推送值A(乔治)
  • 推动价值B(华盛顿)
  • 通过弹出前两个值 并推动结果(乔治和 (华盛顿)
  • 推送值C(玛莎)
  • 不是通过弹出前两个值 并推动结果(乔治和 华盛顿)不是(玛莎)
  • 推送值D(狗)
  • 或者通过弹出前两个值 并推动结果((乔治和 华盛顿)不是(玛莎)或(狗)

  • 这可能会让你开始。。。我会重构这些垃圾,使其更加健壮

    string input = "George Washington AND NOT Martha OR Dog";
    
    private string interpretSearchQuery(string input)
    {
        StringBuilder builder = new StringBuilder();
        var tokens = input.Split( ' ' );
    
        bool quoteOpen = false;
        foreach( string token in tokens )
        {
            if( !quoteOpen && !IsSpecial( token ) )
            {
                builder.AppendFormat( " \"{0}", token );
                quoteOpen = true;
            }
            else if( quoteOpen && IsSpecial( token ))
            {
                builder.AppendFormat( "\" {0}", token );
                quoteOpen = false;
            }
            else
            {
                builder.AppendFormat( " {0}", token );
            }
        }
    
        if( quoteOpen )
        {
            builder.Append( "\"" );
        }
    
        return "'" + builder.ToString().Trim() + "'";
    }
    
    public static bool IsSpecial( string token )
    {
        return string.Compare( token, "AND", true ) == 0 ||
            string.Compare( token, "OR", true ) == 0 ||
            string.Compare( token, "NOT", true ) == 0;
    }
    

    这可能会让你开始。。。我会重构这些垃圾,使其更加健壮

    string input = "George Washington AND NOT Martha OR Dog";
    
    private string interpretSearchQuery(string input)
    {
        StringBuilder builder = new StringBuilder();
        var tokens = input.Split( ' ' );
    
        bool quoteOpen = false;
        foreach( string token in tokens )
        {
            if( !quoteOpen && !IsSpecial( token ) )
            {
                builder.AppendFormat( " \"{0}", token );
                quoteOpen = true;
            }
            else if( quoteOpen && IsSpecial( token ))
            {
                builder.AppendFormat( "\" {0}", token );
                quoteOpen = false;
            }
            else
            {
                builder.AppendFormat( " {0}", token );
            }
        }
    
        if( quoteOpen )
        {
            builder.Append( "\"" );
        }
    
        return "'" + builder.ToString().Trim() + "'";
    }
    
    public static bool IsSpecial( string token )
    {
        return string.Compare( token, "AND", true ) == 0 ||
            string.Compare( token, "OR", true ) == 0 ||
            string.Compare( token, "NOT", true ) == 0;
    }
    

    我想出了一个解决办法。唯一的问题是格式错误的搜索查询将无法正确解析并失败:

    private string interpretSearchTerm(string searchTerm)
            {
                string term = "";
                /* replace ' AND ' | ' AND NOT ' with
                 * " AND "
                 * " AND NOT "
                 * 
                 * replace ' OR ' | ' OR NOT ' with
                 * " OR "
                 * " OR NOT "
                 * 
                 * add " to beginning of string and " to end of string
                 */
                if (searchTerm.IndexOf("AND") > -1
                    || searchTerm.IndexOf("OR") > -1
                    || searchTerm.IndexOf("AND NOT") > -1
                    || searchTerm.IndexOf("OR NOT") > -1)
                {
                    term = searchTerm.Replace(" AND NOT ", "\"AND NOT\"")
                            .Replace(" AND ", "\"AND\"")
                            .Replace(" OR NOT", "\"OR NOT\"")
                            .Replace(" OR ", "\"OR\"");
                    term = "\"" + term + "\"";
                    return term;
                }
                else if (searchTerm.IndexOf("\"") > -1) return searchTerm;
                else return "\"" + searchTerm + "\"";
            }
    

    我现在将着手实现GalacticJello建议的后缀算法。当我让它工作时,我会把它贴上去。

    这里是我想出的一个解决方案。唯一的问题是格式错误的搜索查询将无法正确解析并失败:

    private string interpretSearchTerm(string searchTerm)
            {
                string term = "";
                /* replace ' AND ' | ' AND NOT ' with
                 * " AND "
                 * " AND NOT "
                 * 
                 * replace ' OR ' | ' OR NOT ' with
                 * " OR "
                 * " OR NOT "
                 * 
                 * add " to beginning of string and " to end of string
                 */
                if (searchTerm.IndexOf("AND") > -1
                    || searchTerm.IndexOf("OR") > -1
                    || searchTerm.IndexOf("AND NOT") > -1
                    || searchTerm.IndexOf("OR NOT") > -1)
                {
                    term = searchTerm.Replace(" AND NOT ", "\"AND NOT\"")
                            .Replace(" AND ", "\"AND\"")
                            .Replace(" OR NOT", "\"OR NOT\"")
                            .Replace(" OR ", "\"OR\"");
                    term = "\"" + term + "\"";
                    return term;
                }
                else if (searchTerm.IndexOf("\"") > -1) return searchTerm;
                else return "\"" + searchTerm + "\"";
            }
    

    我现在将着手实现GalacticJello建议的后缀算法。当我让它工作时,我会把它贴上去。

    解释搜索查询到底应该做什么?输入是什么?预期的输出是什么?我会在空间上拆分它,任何不是的数组项,或者我会在“LIKE”%”之前加上“%”,然后将其与空格一起内爆,并将其固定在sql查询的末尾。事实上我不会做这样的事但谁知道。。这可能会奏效。@Oded我添加了更多的信息,对不起。基本上,我希望获取输入并将其转换为可用于从Sql Server全文搜索中获得正确结果的方式。
    interpretatSearchQuery
    究竟应该做什么?输入是什么?预期的输出是什么?我会在空间上拆分它,任何不是的数组项,或者我会在“LIKE”%”之前加上“%”,然后将其与空格一起内爆,并将其固定在sql查询的末尾。事实上我不会做这样的事但谁知道。。这可能会奏效。@Oded我添加了更多的信息,对不起。基本上,我想获取输入并进行转换,以使其能够用于从Sql Server全文搜索中获得正确的结果。这是我最初的想法,我只是希望有一种很好的方法来使用regex。一旦您编写一个快速解析器来获取查询字符串并返回后缀数组,执行查询非常简单。我将使用这种方法,非常智能的解决方案。这是我最初的想法,我只是希望有一种很好的方法来使用regex。一旦编写一个快速解析器来获取查询字符串并返回后缀数组,执行查询就非常简单。我将使用这种方法,非常聪明的解决方案。你的想法启发了我。我的解决方案并不像使用后缀那样完美,但它完成了任务。@samandmoore我也会选择后缀的答案!这是一个比这个黑客更好的“通用”解决方案。你的概念启发了我。我的解决方案并不像使用后缀那样完美,但它完成了任务。@samandmoore我也会选择后缀的答案!这是一个比这个黑客更好的“通用”解决方案。