[搜索关联词解决方案]想找到一个好的同义词解决方案,在javaeye搜此类信息也求不到,后来发了个提问贴也只有浏览数而无回复,不知道这是什么原因,搜索关联词解决方案。 所谓近义词、关联词检索不外乎以下三种形式: 1.类似google suggest,用户输入关键字后自动提示功能。 2.假如“奥运会”的关联词是“北京”,用户输入“奥运会”搜索时,将“奥运会”的搜索结果以及“北京”的搜索结果都搜出来。 3.用户输入“奥运会”搜索,只显示“奥运会”的结果,它的关联词在结果集的底端用“相关搜索”的形式提示给用户。 这三种方式中看似2和3是类似的,其实还是有些很大区别的,我个人认为在实际的应用中,第3种方式是最多见的。 先说说第1种方式 建一个用来存储关键字的表 例如: sql代码 create table keys( item_id varcha2(50) not null, search_key varchar2(100), ); search_key里存储一些检索的关键字,如“奥运”,“奥运会”,“北京奥运会”等. 当用户在文本框敲入时,使用ajax将当前文本框的内容发到action,进行下面类似的操作 java代码 google做的是右边匹配,即是用的 like 'key%' ,输入“奥”字,会出现所有以“奥”字开头的词的提示。 大家应该注意到google suggest的提示词的最后面都写有“约xxxxx条记录”,我现在唯一能想到的解决方案是,当我们在action中拿到匹配的词之后,将匹配的词搜索一次即可得出具体记录的条数,其实这样也不耗多少资源。 第2种方式 将关键词和关键词所联的词的结果都搜出来 我个人认为这个功能在实际的应用中只需用到其5%就可以了,因为在用户体验方面考虑,我们必须保障搜索结果的质量。关键词的近义词可以在结果页的底端提示给用户,也就是我上边说到的第3种方式。 我所说的只需用到5%的意思是只需为少数的、必须转义的词实现这样的功能 比如搜索“china”,那么“中国”这个词的结果肯定得出现在结果集里,还有比如搜索“08”,那么“2008”的结果也得出现在结果集里,这些都是一些特定情况,其它的词没必要做成这样,只需做提示即可。 现在中文检索一般都是基于词库的检索,实现第2种方式这个功能必须将之前的词库以及分词算法进行修改。 一般的方法是在词库中把同义词写成一行,如将“中国 china”写在同一行,然后修改token算法(这个大家可以去研究一下,我现在使用的analyzer包是公司商业上的伙伴提供的测试包,这个测试包已经可以满足很大一部分需求了,我还不知道能不能共享) 其实原理是在索引时将原词和原词的近义词一起索引 具体给大家个例子 有这样一句话 ---- “中国是世界上人口最多的国家” 如果没有为其做同义词,大家可能会索引成这样 [中国][世界][人口][最多][国家] 如果做了同义词,会索引成 [中国][china][世界][人口][最多][国家] 即是说在索引时就已经将“中国”这个词存成[中国][china]了,搜索时无论搜“中国”或是“china”都可以搜到这句话,规划方案《搜索关联词解决方案》。 其实这个功能相当大一部分是依赖第三方的jar包,说来说去也没多大意思,并且大多数情况下我们需要的并不同这种功能,而是更人性化的查询提示的功能,也就是第3种方式。 第3种方式 这种方式是我在原有的系统上改进完成的 那么怎样在原有的基础实现关键词提示功能呢??? 我的做法是这样的,我按照paoding词库的特点新建了一个mydictionary.dic文件放在classpath下,里面的内容大致如下。 第1行:奥运会 北京 2008 第29届奥运会 第2行:中国 china 中华人民共和国 中国电信 中国人民银行 ........ 然后在服务器启动时,将mydictionary.dic这个文件中的文字一行行读入,分别做索引 java代码 在搜索时,对用户输入的关键字正常搜索出结果后,对关键字进行第二次搜索,搜的是同义词的索引,得到的结果按空格分开,即可得到所有同义词,然后将同义词发送至页面即可。 java代码 本文来源:https://www.wddqw.com/doc/2a31cf57b0717fd5370cdcc3.html