0

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

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

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

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

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

4

2 回答 2

0

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

您可以从自定义相似性类开始。
这将允许您修改 IDF 计算。

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

于 2013-02-06T03:57:40.980 回答
0

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

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

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

更新

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

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

更新 2

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

但是,您可能会尝试的一种方法是仅在不同类型中使用不同的字段名称,例如,而不是使用字段namefor userand product,使用user_nameand product_name。然后,术语频率将与该类型中的该字段相关。文档频率显然会考虑所有文档,但看到这是一个全局效应,它不应该有所作为。

于 2013-02-06T10:31:58.440 回答