对多个搜索字段使用通用查询约定

时间:2012-10-04 08:55:27

标签: java hibernate lucene hibernate-search hashtag

想象一下,我正在构建一个标签搜索。我的主索引类型称为Post,它有一个Hashtag项列表,标记为IndexedEmbedded。另外,每个帖子都有一个Comment对象列表,每个对象都包含一个Hashtag对象列表。

在搜索方面,我使用的是MultiFieldQueryParser,我向其传递了一长串可能的搜索字段,包括一些嵌套字段,如:

hashTags.valuecoments.hashTags.value

现在,有趣的事情发生在我想搜索的东西上,比如#architecture。我找出了主题标签的位置,因此最简单的逻辑操作是将#architecture类型的查询转换为类型hashTags.value:architecture or comments.hashTags.value:architecture中的一个尽管可能,这是非常不灵活的。如果我想出另一个包含主题标签的字段怎么办?我也必须包含它。

有没有一般的方法来做到这一点?

P.S。请记住,我要搜索的根类型是Post,因为这是我想要实现的结果

2 个答案:

答案 0 :(得分:5)

Hashtags是关键字,您应该让Lucene处理文本分析以从主文本中提取主题标签并将其存储在自定义字段中。

通过在两个不同的 @Field (使用@Fields注释)中定义要编入索引的文本,您可以使用Hibernate Search轻松完成此操作。您可以有一个名为 comments 的字段和另一个 commentsHashtags

然后将自定义分析器应用于 commentsHashtags ,它会执行一些标准标记化并丢弃任何不以 开头的术语;您可以通过使用标准标记器并应用自定义过滤器轻松定义一个。

当您运行查询时,您不必编写自定义代码来查找查询输入中的主题标签,让它由相同的分析器处理(无论如何都是默认值)并定位两个字段,您甚至可以如果有意义的话,可以更多地增加主题标签。

使用此解决方案

  • 利用搜索文本分析的高效率
  • 避免包含主题标签的数据库上的实体和表:无用的开销
  • 避免搞乱自由文本提取

它为您带来另一个强大的胜利点: 然后,您可以打开原始IndexReader并从 commentsHashtags 加载termvector,以获取所有已使用标记的列表以及有关它们的指标。很酷,可以进行一些数据挖掘,或只是可视化标签云。

答案 1 :(得分:1)

为什么不将帖子注释作为Lucene文档存储,而不是将字段视为不同的字段,将顶级文档视为Post?这样,您可以只搜索一个名为“hashtags”的字段。您还应该有一个名为“type”的字段或用于区分评论和帖子的字段。

搜索结果可能是帖子的评论。如果用户只想搜索帖子或评论,您可以按类型过滤。或者您可以在UI中以不同方式显示它们。

如果你想添加另一个同样使用主题标签的概念(比如...我不知道... splanks或将来我们都给予互联网通信的任何愚蠢的名字),那么你可以将它与现有的帖子一起添加评论文档只是我用“hashtags”字段索引你的新类型。无论如何,你必须做大量的工作来添加splanks,所以为这种新类型的搜索结果添加处理程序不应该带来太大的不便。