【问题标题】:Multiple term frequency vectors with one index具有一个索引的多个词频向量
【发布时间】:2013-02-07 18:20:17
【问题描述】:

我有一个包含许多不同文档类型的应用程序。每种类型都有自己的语料库,我不希望它们相互影响。

例如,如果一种类型包含多次出现的术语 X,那么我不希望这会降低 X 在其他类型中的 IDF 分数。

我知道这可以使用多个索引来实现,但我有很多类型,其中一些包含少量文档。因此,每种类型的索引都会对性能产生不良影响。

有没有什么方法可以让每种类型都有一个唯一的术语向量和一个索引?

我还没有选择任何搜索引擎实现,所以我会感谢 Elasticsearch 和/或 Solr 的答案。

【问题讨论】:

  • 为您希望完全分开的术语创建单独的索引似乎是合乎逻辑的路线。我认为您只希望使用任何给定查询搜索单一类型是否正确?在这种情况下,您预计哪些操作会表现不佳?
  • 虽然我的搜索发生在单一类型中,但我也搜索了应该在所有类型上运行的搜索。我担心第二种情况的性能,但主要是担心支持 100k 索引所需的硬件数量。

标签: solr lucene elasticsearch


【解决方案1】:

在 Elasticsearch 中,您需要将每种类型放在单独的索引中,以避免一种类型的术语向量影响另一种类型的术语向量。

默认情况下,Elasticsearch 为每个新索引分配 5 个主分片(其中每个分片是一个 Lucene 实例)。对于较小的类型,您可以只使用一个主分片创建索引:

curl -XPUT 'http://127.0.0.1:9200/user/?pretty=1'  -d '
{
   "settings" : {
      "number_of_shards" : 1
   }
}
'

更新

关于您关于性能的问题。搜索在每个涉及的分片上并行进行,因此性能实际上取决于您拥有多少硬件以及您的分片有多大(当然还有您的查询的复杂程度)。

如果不测试您的用例和数据,就很难准确估计多个指标对性能的影响。也就是说,ES 是为分布式搜索而构建的,在这种情况下表现得非常好。

更新 2

同一索引中不同类型的字段name 将包含该字段中所有类型的术语,从而污染您的术语频率。

但是,您可以尝试的一种方法是仅使用不同类型的不同字段名称,例如,不要将字段 name 用于 userproduct,而是使用 user_nameproduct_name。然后,术语频率将与该类型中的该字段相关。文档频率显然会将所有文档都考虑在内,但鉴于这是一种全局效应,它不应该产生影响。

【讨论】:

  • 您对使用一个分片的数千个索引对搜索性能(我需要在所有索引中查找一个项目)和所需硬件的影响有任何估计吗?
【解决方案2】:

您始终可以通过减少或消除其影响来调整 IDF。

您可以从 Custom Similarity 类开始。
这将允许您修改 IDF 计算。

查看lucene DefaultSimilarity 类以供参考,这是实际实现。

【讨论】:

  • 我确实想要 IDF 影响力,并且当前的相似度评分对我有好处。问题是我得到的 docFreq 是跨所有文档的。我无法操作 docFreq,因为我对每种类型的术语频率没有先验知识,并且我自己管理术语频率对我来说是个坏主意。
  • 那么在单独的索引中维护数据是唯一的选择,并且相信它不会对性能不利
  • 根据您的经验,拥有数千个(甚至可能超过 100k)个索引不会影响搜索开销,并且不需要更多的硬件来支持它?
  • 100k 个文档,除非拥有非常丰富的内容集,否则最多不会在索引中占用超过几个 GB 的空间。所以我不认为这是一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
相关资源
最近更新 更多