我建立了一个使用ElasticSearch的拍卖系统。它有3个模型,用户,拍卖和出价。用户可以发布拍卖,也可以对其他拍卖进行出价。
我搜索的第一个用例之一是搜索出价。除了通过id,user_id,price等搜索,我遇到了一个有趣的用例。我希望能够搜索用户的名称,并且应该从该用户发布的所有拍卖中返回我的所有出价。
e.g。当我搜索“John”时,它会获得我为用户“John”发布的所有拍卖所发送的所有出价。
这是索引的样子:
Bids
- id (not analyzed)
- user_id (not analyzed)
- price (not analyzed)
- auction_user_name (uses ngrams)
我对此索引有几个问题:
出价有很多行(10M +),auction_user_name
上的n-gram占用了大量空间。我在想是否真的应该在一个单一类型的索引中对这些数据进行去规范化,或者是否有更合适的替代方案(父子类型)?
有些用户非常活跃,可以有数千个出价。如果其中一个更改了其名称,则会导致对出价索引进行数千次更新。这并不理想,并且由于重复,它可能导致写入密集的索引,这可能容易受到拒绝服务。
这两个问题是否有已知的解决方案?我确信我可以做一些权衡来解决这个问题。
我看到了一些建议:https://www.elastic.co/guide/en/elasticsearch/guide/current/relations.html
这些方法并不像我想象的那么优雅,所以如果有更多方法可以解决这个问题,我很感兴趣。