关键字的like 查询,不知道大家有另外的好方法吗

解决方案 »

  1.   

    Nicrosoft(奈软) :如果是专业的全文检索算法,当然是商业秘密。我们暂时把查全率,查准率的要求减低,响应时间也减低,先作一个简单的算法。我记得某个软件可以作到这样的功能:
    检索“华人”,结果中有“华人组织”,“华人社团”,“海外华人”等等,但是可以排除
    “中华人民共和国”,既然它可以分析汉语语义,我想我们的需求它当然可以满足。前面提到不用字典,我想了一下,似乎是不可能的。一定要建立关键词的索引表。欢迎一起开拓思路。
      

  2.   

    下面的算法是我过去的软件中使用的,因为很久没有用了,所以有些一遗忘^-^。源代码删减了部份(因为复串比较的实现算法我不能公开),所以可能会有些问题。此函数可以详细比较两个串的差别,不论串中间有没有间隔。
    如果希望能更好的发挥它的功能,建议你在使用前先进行串整理(如:空格处理,符号处理等)。
    相信对你会有些作用。// 函数返回字符串比较后的字符差别个数
    // ErrNo-原错误数(一般为0)     Value-用户输入的字符串
    // DataStr-原始数据串     MinTestLength-最小检测宽度(一般用1)
    function ErrorTest(ErrNo:integer;StrA,StrB:shortstring;
             MinTestLength:byte=1):integer;
    var
      StrListA,StrListB:TStringList;
      CountA,CountB:integer;
      Ti,Tj,CmpTV:integer;  function Test(ErrNo:integer;StrA,StrB:shortstring):integer;
      var                // 错误检测器
        La,Lb:integer;
        i,j,p:integer;
      begin
        la:=length(stra);
        lb:=length(strb);
        if (la>0) and (lb>0) and (MinTestLength<=la) then
           for i:=0 to la-MinTestLength do
              for j:=1 to i+1 do
                 for p:=1 to lb-la+i+1 do
                    if copy(stra,j,la-i)=copy(strb,p,la-i) then
                       begin
                         errno:=test(errno,copy(stra,1,j-1),
                                copy(strb,1,p-1))+errno;
                         result:=test(errno,copy(stra,la+j-i,i-j+1),
                                 copy(strb,la+p-i,lb-la-p+i+1));
                         exit;
                       end;
        result:=errno+la+lb;
      end;
    begin
      result:=test(errno,stra,strb);
    end;举几个例子:
    ErrorTest(0,'abcde','abc de')=1
    ErrorTest(0,'abc de','ab cde')=2
    ErrorTest(0,'abcde','a12bcdefg',1)=4