问题分析
让我们在以下子问题中解决您的问题:
- (P1)检查数组中提供的所有项是否都出现在
tags.id
或tags.related
中。这可以进一步分解为:
- (P1.1)检查数组中提供的所有术语是否都存在于字段中
- (P1.2)检查数组中提供的所有术语是否分布在不同的字段中
- (P2)为具有任何提供的术语的文档分配更高的分数
tags.id
解决方案
要解决(P1.1),您可以使用terms_set
Elasticsearch v6.6 中提供的查询(请参阅文档)。
为了解决(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),您可以创建一个布尔should
查询,其中包括 (i) 上述terms_set
查询,(ii)仅terms
针对的查询tags.id
,它具有更高的提升因子。IE,
{
"query": {
"bool": {
"should": [
{
"terms_set": {
"tags.all": {
"terms": [ 9, 8 ],
"minimum_should_match_script": {
"source": "2"
}
}
}
},
{
"terms": {
"tags.id": {
"value": [ 9, 8 ],
"boost": 2
}
}
}
]
}
}
}