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