【发布时间】:2019-12-30 00:57:19
【问题描述】:
我需要设计一个可以支持用户特定文档编辑的查询。下面的文档描述了一种存储此数据的方法。下面的文档包括一个根文档 Description 属性。根文档 Description 属性应该被所有用户搜索,除了 Eric 和 Alex。对于 Eric 和 Alex,Description 属性已经过定制,由这些用户中的任何一个执行的搜索查询都应该在嵌套的 UserData 数组中搜索他们的自定义 Description 字段数据。由 Eric 或 Alex 执行的搜索查询不应搜索根文档描述字段。
对于我的用例,用户可以自定义 0 个或多个根文档属性。对于用户自定义的任何根文档属性,应该只为该用户搜索该属性的自定义值。
解决此问题的蛮力方法是为每个自定义文档的单独副本编制索引。我试图避免这种情况,担心为用户自定义的每个文档创建多个副本会通过复制不合法复制的文档内容来不公平地加权索引。
{
"Name": "doc1",
"Description": "Base description1",
"Spec": "Base document spec",
"UserData":[
{
"EnteredBy": "Eric",
"Description": "Desc entered by Eric, abc"
},
{
"EnteredBy": "Alex",
"Description": "Desc entered by Alex, def",
"Spec": "Spec entered by Alex"
}]
}
编辑 1
下面列出了我考虑过的选项。
选项 1:我可以为每个用户创建一个单独的索引。在该索引中,我将添加用户未自定义的所有基本文档,并添加用户自定义的每个文档。这将产生 1000 多个索引。
选项 2:我可以使用 script_score 功能并使用上述覆盖逻辑手动计算每个文档的分数。据我所知,评分逻辑必须是原始的,最终可能会否定 Elasticsearch 的强大功能。
编辑 2
该解决方案最多需要支持 40 个字段,并且在任何一个字段已由多达 200 个用户自定义的情况下。该索引将包含 750,000 个文档。
【问题讨论】:
标签: elasticsearch