在Java / MySQL / Hibernate Search / Lucene环境中建议标签教程
我正在开发一个基于Web的应用程序,该应用程序使我们的用户可以发布典型的博客/微博客/论坛类型的帖子,而我们遇到的一个问题是我们的用户并不是经常标记其内容.由于标签在我们的应用中非常重要,原因有几个,因此我们希望带动用户走向标签行为.
我们实施了哈希标记,这似乎起到了一定作用,并且我们还打算实施某种形式的游戏化来鼓励这种做法.
除了上述内容之外,我们还希望实现标签建议(基本上是StackOverflow所具有的内容).我们希望基于数据库中的现有标签来建议标签,并且当没有匹配的标签时,我们还想建议“突如其来”的标签可能使用某种tf-idf库或其他某种方法.我的问题有两个:
从性能的角度来看,在用户键入时(即在击键时)建议这种标记是否可行?我认为这是您发布问题时StackOverflow所做的方式,我们正在寻找与此类似的内容.还是我们必须做一些后处理(即,在用户已经添加了内容之后,我们建议给他添加标签).
是否有任何我们可以使用的工具/库可以给我们这些建议,也可以给我们提供建议,等等.甚至可能是同义词匹配.我们的数据当前存储在MySQL中,我们也使用Hibernate Search,因此它也存储在Lucene索引中(尽管我们目前不直接通过Hibernate Search与它们进行交互).我们愿意将这些数据存储在其他类型的数据源中,如果这样做会有所帮助.
解决方法:
在每个击键上执行搜索确实是可行的,我们的应用程序当前使用的安装基数是数百万个客户端(尽管它们并非一次搜索所有).我可能会建议在尝试查找标签之前引入一个小的延迟(几秒钟左右),以减少服务器上的负载并防止标签列表过于频繁地更新.
Hibernate Search(通过Lucene)应该能够为您提供所需的功能.搜索的关键是为您的字段设置适当的分析器,以便正确处理同义词和词干(例如,Lucene的EnglishAnalyzer,该词提供了停用词(例如“ the”和“ and”),并使用Porter词干分析器提供词干功能,可能还加上了用您的同义词初始化的SynonymFilter).