使用Lucene在长文本中搜索名称

时间:2015-01-11 21:44:05

标签: solr lucene

我的Lucene索引包含如下名称:

  • douglas adams
  • adams sandlers
  • 亚当斯

等。

当我想搜索名字时,这很容易。但是,我有一些消息需要搜索以检查它是否包含任何这些名称。它们很长很像:

  

广播制作人Dirk Maggs先于1993年与Adams进行了磋商,后来于1997年和2000年根据Hitchhiker系列的第三部小说创作了第三部广播系列。[21]他们还讨论了五本书“三部曲”中最后两部小说的无线电改编的可能性。和电影一样,这个项目只是在亚当斯去世后才实现的。第三个系列,第三阶段,于2004年9月在BBC第四台播出,随后在音频CD上发行。借助他对生命,宇宙,万物和编辑的阅读记录,可以听到亚当斯在追授阿格拉贾格时扮演的角色。如此长,并感谢所有的鱼和大多数无害的人分别制作了第四和第五部电台系列(在电台上他们被命名为The Quandary Phase和The Quintessential Phase),并于2005年5月和6月播出,随后又发行在音频CD上。最后一集中的最后一集(带有一个新的,“更乐观”的结尾)总结道:“道格拉斯亚当斯的银河系漫游指南的最后一集深情地致力于其作者。

问题是这是消息,我需要形成一个查询或一组查询,并需要找到索引的名称。

我尝试单独查看每个术语,但它会产生大量误报,找到包含任何术语的所有名称。

对于上述文字,它应该与“adams”条目匹配,还应与“douglas adams”条目匹配,但不能与“adams sandlers”匹配。正如你所看到的,它就像是在寻找相反的方式,比如搜索文本中的每个条目,但不幸的是它恰恰相反。

有人知道如何处理它吗?我不期待一个确切的解决方案,但任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

这是一个相当简单的方法。

1) Index all your names in Lucene (you've already done this)
2) Fire entire phrase as a query (field: Radio producer Dirk Maggs .......)
3) Get all matched documents/results from Lucene and post process them (you will get doughlas adams, adams sandlers, adams as your top docs)
4) During post processing start with each of matched document, take each term of document and match thru each term of your query, if all terms of your document are found in query consider this document ELSE discard the document (by doing this you are discarding "adam sandlers") - this will be O(n^2) execution.
5) Done

#4会有点贵,如果你有执行时间问题可以进行优化。

我不确定如何在Solr中添加自定义后期处理逻辑,但我确信它可能。

您也可以创建自定义收集器并在此处添加此逻辑,但如果您有大量文档,则执行速度会非常慢。