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