还有一个问题是,像OSChina中的项目名,很多都是类似“Android开发工具包 Android SDK”这样的,按照上面的方法,这样的项目名我们只能依靠项目别名来匹配。但对于大多数项目都没有提取到项目别名,提取的项目别名中也会存在不少错误的。所以项目去重和别名提取直接影响着后面的匹配。
首先一点,帖子的标题我们肯定是需要分词建索引的,那么如果帖子标题中存在“Android SDK”这样的项目名,分词建索引后是按照“Android”、“SDK”一个一个词存放的,所以用Lucene全文搜索“Android SDK”时没有返回结果。 这个问题的一个解决方案是我们在建索引之前将所有的项目全名加入IK分词器的扩展词典,那么分词时会将这些扩展词分成一个词,即如果如果帖子标题中存在“Android SDK”这样的项目名,分词时会分成“Android SDK”。这样便可以返回结果。但还有问题是,对于新进来的项目,我们没有该项目名的扩展词,那么已经建好的索引就可能是把该项目名分词存放的,那么该项目全名可能用Lucene搜索不到结果。扩展词更新之后只有重建索引才能有效果,如果每进来一个项目就重建一次索引代价太大。 因此考虑另外一个方案是,对项目名和项目别名都分词,但要求项目名分词后的所有词都必须在某个索引文档中全部命中才算匹配上,如“Android SDK”分词后要求“Android”、“SDK”两个词都在帖子标题中出现才视为与该帖子标题匹配。逆向匹配,即用帖子标题匹配项目名时,我正在寻找方法看能不能只留下那些项目名的分词都在帖子标题中出现的结果。但这个方法在用帖子标题匹配项目别名时还存在问题,因为项目别名这个字段可能存放着多个项目别名,对项目别名这个字段建索引后,如果要求某个帖子标题中包含所有项目别名的分词,这样会使得很多结果匹配不上。