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