我有一个包含许多不同文档类型的应用程序。每种类型都有自己的语料库,我不希望它们相互影响。
例如,如果一种类型包含多次出现的术语 X,那么我不希望这会降低 X 在其他类型中的 IDF 分数。
我知道这可以使用多个索引来实现,但我有很多类型,其中一些包含少量文档。因此,每种类型的索引都会对性能产生不良影响。
有什么方法可以让每种类型都有一个唯一的术语向量和一个索引?
我还没有选择任何搜索引擎实现,所以我会感谢 Elasticsearch 和/或 Solr 的答案。
我有一个包含许多不同文档类型的应用程序。每种类型都有自己的语料库,我不希望它们相互影响。
例如,如果一种类型包含多次出现的术语 X,那么我不希望这会降低 X 在其他类型中的 IDF 分数。
我知道这可以使用多个索引来实现,但我有很多类型,其中一些包含少量文档。因此,每种类型的索引都会对性能产生不良影响。
有什么方法可以让每种类型都有一个唯一的术语向量和一个索引?
我还没有选择任何搜索引擎实现,所以我会感谢 Elasticsearch 和/或 Solr 的答案。
在 Elasticsearch 中,您需要将每种类型放在单独的索引中,以避免一种类型的术语向量影响另一种类型的术语向量。
默认情况下,Elasticsearch 为每个新索引分配 5 个主分片(其中每个分片是一个 Lucene 实例)。对于较小的类型,您可以只使用一个主分片创建索引:
curl -XPUT 'http://127.0.0.1:9200/user/?pretty=1' -d '
{
"settings" : {
"number_of_shards" : 1
}
}
'
关于你关于性能的问题。搜索在每个涉及的分片上并行进行,因此性能实际上取决于您拥有多少硬件以及您的分片有多大(当然还有您的查询有多复杂)。
如果不测试您的用例和数据,很难准确估计多个索引对性能的影响。也就是说,ES 是为分布式搜索而构建的,并且在这种情况下表现得非常好。
name
同一索引中不同类型的字段将包含该字段中所有类型的术语,从而污染您的术语频率。
但是,您可能会尝试的一种方法是仅在不同类型中使用不同的字段名称,例如,而不是使用字段name
for user
and product
,使用user_name
and product_name
。然后,术语频率将与该类型中的该字段相关。文档频率显然会考虑所有文档,但看到这是一个全局效应,它不应该有所作为。