如何实现模糊查找?

shenqiudeye2 2010-06-17 07:28:19
如何实现模糊查找?

我在做一个小的查询软件,j2se,access,swing.

输入:中国建行
能找到:中国建设银行

输入:中国建设银行
能找到:中国建行


要求是输入关键字后,查询,得到一个查找结果的列表,根据匹配程度排序,就像百度一样。

我找了很多资料,正则,sql模糊查找,java分割字符串等,还是没能解决,请高手来教教我。
...全文
992 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenqiudeye2 2010-06-19
  • 打赏
  • 举报
回复
谢谢各位的回答,非常感谢,我查了很多资料,也发现我的问题不仅仅是模糊查询的问题了,和搜索引擎有点靠边了呵呵。

能不能请各位高手弄些代码上来,我看你们说的文字,并不能解决问题啊
heartraid86 2010-06-19
  • 打赏
  • 举报
回复
如果仅仅是在众多词条中查找相似的词语,可以试试一些搜索引擎中查询扩展的方法。

有一种算法叫字符串编辑距离,可以算算"中国建设银行"与"中国建行"的编辑距离。

或者使用NLP领域的点互信息方法,计算"中国建设银行"与"中国建行"的PMI值,来确定两者是否有很大的联系。

现在基于维基百科做的词条相似度计算也很多,看看一些信息检索中查询扩展的论文应该很有用
small_agile 2010-06-19
  • 打赏
  • 举报
回复
我不知道你的swing編程是怎麼樣子的. 但是在j2ee中是這樣實現的.

將前臺的值得到.. 在寫sql語句的時候

package com.spring.mvc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class csnd2 {
public static void main(String args[])throws Exception{
String driver= "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url="jdbc:sqlserver://localhost:1433;database=???";
String username = "?";
String password ="";
Connection conn;
PreparedStatement pstmt;
Class.forName(driver);
conn = DriverManager.getConnection(url,username,password);
String str = "???";
String sql="select ???? from tableName where ?? like '"+str+"'";
pstmt = conn.prepareStatement(sql);
pstmt.executeUpdate();

}
}
宁静-夏天 2010-06-19
  • 打赏
  • 举报
回复
http://qieqie.javaeye.com/blog/110148

这个是 王切切 的blog地址,里面有他写的分词器,里面有你需要的东西。

如果简单做只需要它的词库检索部分代码。

他的代码值得你花时间全部读一次,写的不错。具体你再有问题再问吧。

方法告诉你了,做要自己了。
宁静-夏天 2010-06-18
  • 打赏
  • 举报
回复
如果仅仅考虑分词,并不会涉及搜索引擎其他的部分的。

分词只是搜索引擎十分小的一部分,当然分词做牛也不小。

但简单的分词需求并没有大家想的这么夸张,了解了就会觉得很简单。
surelei 2010-06-18
  • 打赏
  • 举报
回复
搜索引擎是有词库的,还会做一些词法分析,LZ的问题不是模糊查询的问题,是搜索引擎的问题。
wakeUpDoNottLazy 2010-06-18
  • 打赏
  • 举报
回复
不知道真正的搜索引擎是怎么做到的!
但是如果让我做,最简单的就是要建立一些映射,如同 LS 所说
宁静-夏天 2010-06-18
  • 打赏
  • 举报
回复
楼主如果不涉及搜索引擎,只是做这个简单的搜索功能还是比较容易的。

维护两个词库
----------
全称词库
简称词库
----------

他们存在简称和全称的对应关系。

输入在两个词库进行检索,检索成功返回时将简称和全称全部返回即可。


词库检索可以考虑 庖丁分词的 词库代码,他写的不错。也可以自己写。
宁静-夏天 2010-06-18
  • 打赏
  • 举报
回复
这个属于词库检索问题,的确是搜索引擎中经常遇到的问题。

---------------
输入:中国建行
能找到:中国建设银行

输入:中国建设银行
能找到:中国建行
---------------
但达到这些效果做法也不一样。

词库维护、检索为了做到人性化是需要考虑简称转化问题。好的分词,词库分词功能中都包含简称和全称转化。
该功能也类似于中文数字和阿拉伯数字的转化等等。

大多是做统一的转化。一般是在查询时通过把简称转化为全称(即简称词库检索得到后,自动返回对应的全称)。即 中国建行 -> 中国建设银行



所以一般如下需求

输入:中国建设银行
能找到:中国建行

这种需求是不太会去做的。

因为搜索检索的索引文件都是以一个一致的内容在做索引,要不就是全称要不就是简称。




但撇开以上的说法,把 中国建设银行、中国建行 放在同样的地位上,那么要达到楼主的需求,就需要考虑对输入的文字进行分词时,采用最大分词(即分词最多的模式)。

然后再通过分到的词去检索。


取个例子吧
词库包含:中国 建设 银行 建行 建设银行 中国建行 中国银行 中国建设银行 ......

输入:中国建设银行
分词得到:中国、中国建设、中国建设银行、建设、建设银行、银行

根据分到词拼装query term(配置单元)匹配情况如下:
中国 -> 中国、中国建设、中国建行、中国银行、中国建设银行
中国建设 -> 中国建设、中国建设银行
中国建设银行 -> 中国建设银行
建行 -> 建设、建设银行
建设银行 -> 建设银行
银行 -> 银行



不涉及简称转化,词库中的只有‘建行’是查不出来的,只能查到建设银行。这个还只是一个小例子。

但查出来的东西太多了,这个往往不是最好的结果。



zi_yu 2010-06-17
  • 打赏
  • 举报
回复
输入:中国建设银行
能找到:中国建行
这种模糊查询倒没有试过
luffyke 2010-06-17
  • 打赏
  • 举报
回复
sql like关键字

OR

lucene检索
smmi 2010-06-17
  • 打赏
  • 举报
回复
你要做的不是模糊查询,而是一个搜索引擎
chosen0ne 2010-06-17
  • 打赏
  • 举报
回复
试着用用lucene
xqyky 2010-06-17
  • 打赏
  • 举报
回复
输入:中国建设银行
能找到:中国建行
=========================
这绝不是模糊查询出来的。
这些常用关键词都有索引的。
冰思雨 2010-06-17
  • 打赏
  • 举报
回复
这是检索功能,与普通的查找,应该是有区别的吧?
BigKing911 2010-06-17
  • 打赏
  • 举报
回复
每天回帖是有几分的哦!
chengyu2099 2010-06-17
  • 打赏
  • 举报
回复
输入:中国建设银行
能找到:中国建行

模糊查询这么久,这个问题我倒没有想过,杯具,顶!
luowen2008 2010-06-17
  • 打赏
  • 举报
回复
期待大师们分享你们的心得
my5sky 2010-06-17
  • 打赏
  • 举报
回复
这得用到算法了吧,拆分词组,再匹配检索吧
cwjieNo1 2010-06-17
  • 打赏
  • 举报
回复
应当是输入中国建行,能 查找到 中国建设银行·

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧