java实现模糊搜索算法

java实现模糊搜索算法

介绍

这里说的模糊查询不是sql中like的效果,是相当于lucene中的FuzzyQuery效果。
比如:搜索值是"hella",匹配的数据是"hello",则模糊度为1匹配上该数据。

代码

算法:

    public static boolean fuzzySearch(String query, String data){
        int allowCount = 0;// 允许改动数
        int counted = 0;// 已改动数
        int searchIndex = 0;// 搜索值的指针
        int dataIndex = 0;// 待匹配数据值的指针
        boolean flag = true;// 上一值是否确认
        int i;

        // 切割搜索值获取给定的允许改动数
        if ((i=query.indexOf("~")) > -1){
            if ((i+1) < query.length()){
                allowCount=Integer.valueOf(query.substring(i+1));
            }else{
                allowCount=2;
            }
        }

        // 搜索值数组
        char[] searchArrays = query.substring(0,i).toCharArray();
        // 待匹配的数据数组
        char[] dataArrays = data.toCharArray();

        // 开始处理
        A:
        while(true){
            if (counted>allowCount){
                return false;
            }
            if (dataIndex >= dataArrays.length){
                counted+=(searchArrays.length-searchIndex);
                break;
            }

            if (flag){
                boolean match = false;
                for (int j=0;j<=(allowCount-counted);j++){
                    if ((j+searchIndex)>=searchArrays.length){
                        counted+=(dataArrays.length-dataIndex);
                        break A;
                    }
                    if (dataArrays[dataIndex]==searchArrays[j+searchIndex]){
                        if (j>1){
                            break;
                        }
                        counted+=j;
                        searchIndex+=(j+1);
                        match = true;
                        break;
                    }
                }
                if (!match){
                    counted+=1;
                    flag = false;
                }
            } else{
                boolean match = false;
                for (int j=0;j<=(allowCount-counted+1);j++){
                    if ((j+searchIndex)>=searchArrays.length){
                        counted+=(dataArrays.length-dataIndex-1);
                        break A;
                    }
                    if (dataArrays[dataIndex]==searchArrays[j+searchIndex]){
                        if (j>2){
                            break;
                        }
                        if (j>1){
                            counted+=(j-1);
                        }
                        searchIndex+=(j+1);
                        match = true;
                        flag = true;
                        break;
                    }
                }
                if (!match){
                    counted+=1;
                    flag = false;
                }
            }
            dataIndex++;
        }
        if (counted>allowCount){
            return false;
        }
        return true;
    }

测试

    public static void main(String[] args) throws Exception {
        boolean flag = fuzzySearch("ellho~2","hello");
        System.out.println(flag);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值