我正在构建一个应用程序,我需要根据几个参数匹配用户。我有两个弹性搜索索引,一个包含用户的好恶,一个包含有关用户的一些元数据。
/user_profile/abc12345
{
"userId": "abc12345",
"likes": ["chocolate", "vanilla", "strawberry"]
}
/user_metadata/abc12345
{
"userId": "abc12345",
"seenBy": ["aaa123","bbb123", "ccc123"] // Potentially hundreds of thousands of userIds
}
有人建议我制作这些单独的索引并交叉引用它们,但我该怎么做?例如,我想搜索一个喜欢 chocolate
并且未被用户 abc123
看到的用户。我该如何编写此查询?
答案 0 :(得分:0)
如果这是您的用例中的频繁查询,我建议合并索引(始终根据您的查询设计索引)。
无论如何,对于您当前的情况,一种可能的解决方法是利用两个索引将用户标识符存储在具有相同名称 (userId
) 的字段中这一事实。然后,您可以 (1) 对两个索引发出布尔查询,根据 likes
字段匹配一个索引中的文档,以及基于 seenBy
字段的另一个索引中的文档,(2)使用 terms 桶聚合来获取满足您的条件的唯一 userId
列表。
例如
GET user_*/_search
{
"size": 0,
"query": {
"bool": {
"should": [
{
"match": {
"likes": "chocolate"
}
},
{
"match": {
"seenBy": "abc123"
}
}
]
}
},
"aggs": {
"by_userId": {
"terms": {
"field": "userId.keyword",
"size": 100
}
}
}
}