如何用Java编写数据库查询中最接近的匹配字符串搜索?

如何用Java编写数据库查询中最接近的匹配字符串搜索?,java,mysql,string,search,Java,Mysql,String,Search,我的具体问题与一个Android项目有关,但这不是一个具体的Android问题 我基本上只是想找到一种方法,可以查询数据库并返回结果,而不是基于精确匹配,而是基于类似的术语,甚至在搜索字符串是否“包含”类型值的范围之外 比如说,我有一个条目叫做“大力水手鲶鱼”。假设有人输入术语“P’s CatSalmon”并正在寻找该条目。我想返回一个查询列表,它基本上显示了“最相似”的匹配 我承认我在数据库查询方面完全是新手,所以可能有现成的答案,我就是找不到(我确实找过)。我有几种方法可以做到这一点: 我可

我的具体问题与一个Android项目有关,但这不是一个具体的Android问题

我基本上只是想找到一种方法,可以查询数据库并返回结果,而不是基于精确匹配,而是基于类似的术语,甚至在搜索字符串是否“包含”类型值的范围之外

比如说,我有一个条目叫做“大力水手鲶鱼”。假设有人输入术语“P’s CatSalmon”并正在寻找该条目。我想返回一个查询列表,它基本上显示了“最相似”的匹配

我承认我在数据库查询方面完全是新手,所以可能有现成的答案,我就是找不到(我确实找过)。我有几种方法可以做到这一点:

  • 我可以拆分搜索字符串,并在实际条目的“包含”搜索中查找每个字符串的单独部分。例如,我可以将“P”、“Cat”和“Salmon”这三个词分开搜索,然后编写一些其他代码来找出最佳结果。然而,我真的不知道我将如何编写它,以便程序能够选择最好的片段。例如,它如何知道在不重复每一种可能性的情况下选择“猫”(这几乎肯定是不现实的)

  • 我可以让用户痛苦一段时间,直到标签存在。我的意思是,一旦通过“正确”名称找到了正确的条目,我可以让用户用相关名称标记它,然后由以后的用户在搜索中包含单独的相关名称

  • 根据我目前的知识水平,我想不出比这更好的了


    提前谢谢你的帮助

    我猜这是某种查找位置的应用程序。所以我们假设位置的数量很小,比如说少于200个

    首先,您将构建一个搜索,查找用户在位置中键入的“单词”。在您的示例中,我们有“P”和“CatSalmon”。“鲶鱼什么都配不上,P's也配不上。”

    因此,您返回的内容如下所示:

    Locations found for "P's CatSalmon"
    -----------------------------------
    No locations found.  Try using different search terms.
    
    Locations found for "P CatSalmon"
    ---------------------------------
    Popeye's Catfish
    Public library
    Hope Restaurant
    ...
    
    因此,我们的用户输入“p CatSalmon”

    因此,返回所有以字母p开头的位置,然后返回包含字母p的位置

    大概是这样的:

    Locations found for "P's CatSalmon"
    -----------------------------------
    No locations found.  Try using different search terms.
    
    Locations found for "P CatSalmon"
    ---------------------------------
    Popeye's Catfish
    Public library
    Hope Restaurant
    ...
    
    现在,这里是它变得有趣的地方

    当用户选择位置时,您将记录搜索词和所选位置

    在您的示例中,用户会选择“大力水手鲶鱼”

    因此,稍后,您将手动将此键值添加到同义词映射中

    Key        Value
    ---------  ----------
    CatSalmon  Catfish
    
    随着时间的推移,您的搜索将变得更好,因为您的用户将定义同义词

    所以,概括一下

    • 搜索以单词开头的位置

    • 您可以搜索包含单词的位置

    • 在同义词映射中查找同义词,并对同义词重复启动/包含过程

    • 首先显示起始位置,然后显示包含位置


    最后,使用数据库在服务器上完成所有这些工作。将已排序的位置列表传递给手机。不要让手机完成所有工作。

    这是我根据顺序字符数通过查询突出显示最接近匹配的术语的内容

    公共类序列匹配{

    public static void main(String [] args)
    {
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        String query = "P's SalmonCat ";
    
        map = addTermsToHashMap(map);// add terms to a hash map
        map = compareFirstCharacter(map, query);// compare the initial first character
        map= compareSequentialCharacters(map, query);// compare terms to query and add score based on the number of matches
        printResults(map);
    }
    
    
        public static HashMap<String,Integer> addTermsToHashMap(HashMap<String,Integer> map){
        String term = "Popeye's CatFish";
        String otherTerm = "Popets CatSalmon";
        map.put(term,0);
        map.put(otherTerm,0);
    
        return map;
        } 
    
        public static HashMap<String,Integer> compareFirstCharacter(HashMap<String,Integer> map,String query){
    
            for(Map.Entry<String,Integer> e: map.entrySet())
            {
                String term = e.getKey();
                char [] termChar = term.toCharArray();
                char [] queryChar = query.toCharArray();
    
                if((queryChar[0]) == (termChar[0]))
                {
                    int value = map.get(term);
                    map.put(term,++value);
                }
            }
    
            return map;
        }
    
        public static HashMap<String,Integer> compareSequentialCharacters(HashMap<String,Integer> map,String query){
            for(Map.Entry<String,Integer> e: map.entrySet())
            {
                String term = e.getKey();
                char [] termChar = term.toCharArray();
                char [] queryChar = query.toCharArray();
    
    
    
                for(int i = 0; i < queryChar.length -1; i++)
                {
                    for(int j = 0; j < termChar.length -1; j++)
                    {
                        if(queryChar[i] == termChar[j] )
                        {
                            if((queryChar[i + 1]) == (termChar[j + 1]))
                            {
                                System.out.println((queryChar[i + 1]) + " " + (termChar[j + 1]));
                                int value = map.get(term);
                                map.put(term,++value);
                                break;
                            }
                        }   
                    }
                }
                }   
            return map;
        }
    
        public static void printResults(HashMap<String,Integer> map)
        {
            for (Map.Entry<String, Integer> entry : map.entrySet()) {
                System.out.println(entry.getKey()+" : "+entry.getValue());
            }
        }
    
    
    }
    
    publicstaticvoidmain(字符串[]args)
    {
    HashMap=newHashMap();
    String query=“P的SalmonCat”;
    map=addTermsToHashMap(map);//将术语添加到哈希映射
    map=compareFirstCharacter(map,query);//比较初始的第一个字符
    map=compareSequentialCharacters(map,query);//比较要查询的术语,并根据匹配数添加分数
    打印结果(地图);
    }
    公共静态HashMap addTermsToHashMap(HashMap映射){
    String term=“大力水手鲶鱼”;
    字符串otherTerm=“Popets CatSalmon”;
    map.put(术语,0);
    map.put(其他术语,0);
    返回图;
    } 
    公共静态HashMap compareFirstCharacter(HashMap映射,字符串查询){
    对于(Map.Entry e:Map.entrySet())
    {
    字符串项=e.getKey();
    char[]termChar=term.tocharray();
    char[]queryChar=query.tocharray();
    if((queryChar[0])==(termChar[0]))
    {
    int值=map.get(术语);
    map.put(术语+值);
    }
    }
    返回图;
    }
    公共静态HashMap compareSequentialCharacters(HashMap映射,字符串查询){
    对于(Map.Entry e:Map.entrySet())
    {
    字符串项=e.getKey();
    char[]termChar=term.tocharray();
    char[]queryChar=query.tocharray();
    for(int i=0;i
    我自己也是一个新手,但如果你按顺序字符匹配进行比较,也许你可以使用hashMap对每个术语按顺序匹配的字符进行评分。例如,“P’s CatSalmon”与“Popeye’s Catfish”的比较得分为6。是的,这就是我的计算结果,基本上是“标签”“方法。我喜欢这个主意