我在具有以下结构的elasticsearch文档中有一个名为标签的字段。
tags = [
{
"id": 10,
"related": [9, 8, 7]
}
]
我现在运行带有列表的过滤器。例如
[10, 9]
。我只想过滤那些包含ID或相关列表中所有项目的文档。如果我使用[9, 8]
搜索,则应返回上述文档。如果我使用[9, 12]
搜索,则不应返回上述文档,因为ID或相关项中均不存在12。我尝试了条件过滤器,但它确实做到了。有什么技术可以实现上述目标。
此外,与包含
related
中包含给定项目的项目相比,我想为包含id中给定项目的文档提供更高的排名。
最佳答案
问题分析
让我们通过以下子问题来解决您的问题:
tags.id
或tags.related
中。这可以进一步分解为:tags.id
解
要解决(P1.1),可以使用Elasticsearch v6.6中可用的
terms_set
查询(请参阅documentation)。为了解决(P1.2),我将
tags.id
和tags.related
的所有值复制到一个名为tags.all
的新自定义字段中。这可以通过使用copy_to
属性来实现,如下所示:{
"mappings": {
"_doc": {
"properties": {
"tags": {
"properties": {
"id": {
"type": "long",
"copy_to": "tags.all"
},
"related": {
"type": "long",
"copy_to": "tags.all"
}
}
}
}
}
}
}
然后,要解决(P1),可以对
terms_set
运行tags.all
查询。例如。,{
"query": {
"terms_set": {
"tags.all": {
"terms": [ 9, 8 ],
"minimum_should_match_script": {
"source": "2"
}
}
}
}
}
最后,要解决(P2),您可以创建一个 bool(boolean)
should
查询,该查询包括(i)上述terms_set
查询,(ii)仅针对terms
的tags.id
查询,它具有更高的提升因子。即{
"query": {
"bool": {
"should": [
{
"terms_set": {
"tags.all": {
"terms": [ 9, 8 ],
"minimum_should_match_script": {
"source": "2"
}
}
}
},
{
"terms": {
"tags.id": {
"value": [ 9, 8 ],
"boost": 2
}
}
}
]
}
}
}
关于elasticsearch - 过滤文档以匹配嵌套Elasticsearch字段中的两个字段中的一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55015515/