elasticsearch - 过滤文档以匹配嵌套Elasticsearch字段中的两个字段中的一个

标签 elasticsearch elasticsearch-dsl elasticsearch-dsl-py

我在具有以下结构的elasticsearch文档中有一个名为标签的字段。

tags = [
    {
        "id": 10,
        "related": [9, 8, 7]
    }
]

我现在运行带有列表的过滤器。例如[10, 9]。我只想过滤那些包含ID或相关列表中所有项目的文档。如果我使用[9, 8]搜索,则应返回上述文档。如果我使用[9, 12]搜索,则不应返回上述文档,因为ID或相关项中均不存在12。

我尝试了条件过滤器,但它确实做到了。有什么技术可以实现上述目标。

此外,与包含related中包含给定项目的项目相比,我想为包含id中给定项目的文档提供更高的排名。

最佳答案

问题分析

让我们通过以下子问题来解决您的问题:

  • (P1)检查数组中提供的所有术语是否都存在于tags.idtags.related中。这可以进一步分解为:
  • (P1.1)检查数组中提供的所有术语是否存在于
  • 字段中
  • (P1.2)检查数组中提供的所有术语是否分布在不同的字段中
  • (P2)给具有提供的任何术语作为tags.id
  • 的那些文档分配更高的分数




    要解决(P1.1),可以使用Elasticsearch v6.6中可用的terms_set查询(请参阅documentation)。

    为了解决(P1.2),我将tags.idtags.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)仅针对termstags.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/

    相关文章:

    python - 使用elasticsearch遍历查询的所有结果

    java - 在elasticsearch相似性实现中无法覆盖ClassicSimilarity中的scorePayload函数

    elasticsearch - Elasticsearch-将视频目录信息建模为一个索引与多个索引

    linux - 如何使用 ssh 在 Linux 主机服务器上安装 Elastic Search

    elasticsearch - 如何在Elasticsearch中获得嵌套字段的不同值?

    elasticsearch - 使用python中的 Elasticsearch DSL访问单个字段

    elasticsearch - 如何在Elasticsearch中的嵌套文档中搜索精确文本

    elasticsearch - 如何在Elasticsearch中实现此sql查询结果

    elasticsearch - Elasticsearch 中的条件查询搜索

    mysql - 如何创建模拟我的 mysql 数据库的 Elasticsearch 索引