gpt4 book ai didi

用户数据覆盖的 Elasticsearch 查询

转载 作者:行者123 更新时间:2023-12-01 13:11:46 29 4
gpt4 key购买 nike

我需要设计一个可以支持用户特定文档编辑的查询。下面的文档描述了一种存储此数据的方法。下面的文档包含一个根文档Description 属性。除了 Eric 和 Alex 之外,所有用户都应该搜索根文档的Description 属性。对于 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 个文档。

最佳答案

如何创建稍微不同的文档结构,带有嵌套字段,并将用户添加到嵌套参数中?例如

POST /st_t2/_doc
{
"Name":"doc1",
"Description": [
{"base": "wtf"},
{"Alex": "Desc entered by Alex, aaa"}

],
"Spec": [
{"base": "Base document spec"}
]
}

然后你可以像这样创建 bool 查询:

GET st_t2/_search
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"exists": {
"field": "Description.Eric"
}
},
{
"match": {
"Description.Eric": "wtf"
}
}
]
}
},
{
"bool": {
"must_not": [
{
"exists": {
"field": "Description.Eric"
}
}
],
"must": [
{
"match": {
"Description.base": "wtf"
}
}
]
}
}
]
}
}
}

更新:

在实现此解决方案期间,@Eric Bowden 决定使用 nested 映射,并在嵌套字段内使用提供的 existmatchworking example

关于用户数据覆盖的 Elasticsearch 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59524627/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com