搜索关联词解决方案

时间:2022-10-21 19:08:16 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。


[搜索关联词解决方案]想找到一个好的同义词解决方案,在javaeye搜此类信息也求不到,后来发了个提问贴也只有浏览数而无回复,不知道这是什么原因,搜索关联词解决方案。

所谓近义词、关联词检索不外乎以下三种形式:

1.类似google suggest,用户输入关键字后自动提示功能。 2.假如“奥运会”的关联词是“北京”,用户输入“奥运会”搜索时,将“奥运会”的搜索结果以及“北京”的搜索结果都搜出来。

3.用户输入“奥运会”搜索,只显示“奥运会”的结果,它的关联词在结果集的底端用“相关搜索”的形式提示给用户。

这三种方式中看似23是类似的,其实还是有些很大区别的,我个人认为在实际的应用中,第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