3

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

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

hashTags.valuecoments.hashTags.value

现在,有趣的事情发生在我想搜索某些东西时,比如说#architecture。我知道标签在哪里,所以最简单的逻辑是将#architecture类型的查询转换为其中一种类型hashTags.value:architecture or comments.hashTags.value:architecture虽然可能,但这非常不灵活。如果我想出另一个包含主题标签的字段怎么办?我也必须包括在内。

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

PS 请记住,我正在搜索的根类型是 Post,因为这是我想要实现的结果

4

2 回答 2

5

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

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

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

当您运行查询时,您不必编写自定义代码来在查询输入中查找主题标签,让它由同一个分析器处理(无论如何这是默认设置)并针对两个字段,您甚至可以提升主题标签如果这是有道理的,那就更多。

有了这个解决方案,您

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

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

于 2012-10-04T11:15:40.223 回答
1

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

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

如果您想添加另一个也使用主题标签的概念(例如......我不知道...... splanks 或我们将来都给互联网通信起的任何愚蠢的名字),那么您可以将它添加到现有的帖子和评论文档旁边简单我用“hashtags”字段索引你的新类型。无论如何,您必须做大量工作才能添加 splanks,因此为这种新型搜索结果添加处理程序应该不会带来太多不便。

于 2012-10-15T21:48:56.933 回答