java如何对一大堆字符串进行多关键词搜索,同时多关键词可以进行与或非组合关系。用正则表达式好像是一下搞不定的,请教有没有做过类似功能的。特别说明,多个关键词之间可以有括号、以及与、或、非逻辑运算符

解决方案 »

  1.   

    public string Filter(string str)
            {
                if (string.IsNullOrEmpty(str))
                {
                    return string.Empty;
                }
                int len = str.Length - 1;
                char[] sb = str.ToCharArray();
                bool isOK = true;
                for (int i = 0; i <= len; i++)
                {
                    if (keyDict.ContainsKey(str[i]))
                    {
                        int j = i;
                        foreach (string s in keyDict[str[i]])
                        {
                            foreach (char c in s)
                            {
                                if ( j >= len || c != str[j++])
                                {
                                    isOK = false;
                                    break;
                                } 
                            }
                            if (isOK)
                            {
                                for (int k = i; k < j; k++)
                                    sb[k] = '*';
                                i = j;
                                break;
                            }
                            else
                            {
                                j=i;
                                isOK = true;
                            }
                        } 
                    } 
                }
                return new string(sb);
            }
    这里有个高手,写的,
    http://www.cnblogs.com/hlxs/archive/2012/01/31/2333278.html
      

  2.   

    搜索引擎太庞大了,其实这个功能类似于爬虫分类,比如从网站上爬到一篇文章后,要对文章进行关键词分类,
    这时候需要定义一个关键词表达式,比如:((CSDN&精华)|(ITEYE&精华))!精华推荐这个表达式的意思是,我要找页面上同时存在"CSDN"和"精华",或者"ITEYE"和"精华"的,但是不能有"精华推荐"的文章。搜索引擎中有比较独立的比对算法吗,能够单独抽出来调用吗?
      

  3.   

    复杂规则解释开发起来会比较麻烦,建议考虑把组合规则拆分为多条独立规则,比如:
    ——我要找页面上同时存在"CSDN"和"精华",或者"ITEYE"和"精华"的,但是不能有"精华推荐"的文章。你现在设计是:
    ——((CSDN&精华)|(ITEYE&精华))!精华推荐直接拆分为三条规则:
    —— 精华推荐:有则直接判定失败。
    —— CSDN 精华:有则匹配成功。
    —— ITEYE 精华:有则匹配成功。程序执行时就按规则顺序检查,整体处理会简单许多。最后,为了书写便捷,可以再考虑书写时合并,比如:
      !精华推荐 | CSDN 精华 | ITEYE 精华
    但这样会引入新的问题,比如转义字符(假如你刚好需要匹配 感叹号 的时候)