【问题标题】:Elastic match documents containing all values in array包含数组中所有值的弹性匹配文档
【发布时间】:2020-09-28 16:04:44
【问题描述】:

我在 Elastic 中有如下文件。每个文档都有一些信息和访问该文档的所有强制权限。

当我查询时,我想传递所有用户权限并接收匹配的文档,但查询时遇到困难。

文件:

{
    "id": 1,
    "permissions": ["a", "d"]
}
{
    "id": 2,
    "permissions": ["a"]
}
{
    "id": 3,
    "permissions": ["a", "b"]
}
{
    "id": 4,
    "permissions": ["a", "c"]
}

这是我得到的最接近的:

{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "tags.keyword": "a"
          }
        },
        {
          "match_phrase": {
            "tags.keyword": "b"
          }
        },
      ],
      "minimum_should_match": doc.tags.length
    }
  }
}
// Result are documents with id's 2 and 3.

我尝试用"script" 扩展"minimum_should_match" 但没有成功(显然它不支持它):

"script" : {
    "script" : {
        "inline": "doc['permissions'].length",
        "lang": "painless"
     }
}

在上面的示例中,使用传递的权限数组 ["a", "b", "c"],输出应该是 id 为 2、3 和 4 的文档。["a"] 仅匹配 id 为 2 的文档。

编辑:附加信息 一个文档最多有 5 个权限,以及用户,但是权限集非常大(500+),所以我正在搜索一个通用查询。数据也可以转换。

我正在使用 Elastic 7.6 任何帮助表示赞赏!

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    没有有效的方法来达到您的预期结果,但除了以下搜索查询之外,您甚至可以使用脚本获取结果,请参阅SO answer 了解这一点。

    您可以使用 Terms Query 返回在提供的字段中包含一个或多个确切术语的文档。

    添加一个带有索引数据(与问题中给出的相同)、索引映射、搜索查询和搜索结果的工作示例。

    索引映射:

    {
      "mappings": {
        "properties": {
          "id": {
            "type": "integer"
          },
          "permissions": {
            "type": "text"
          }
        }
      }
    }
    

    搜索查询:

     {
      "query": {
        "constant_score": {
          "filter": {
            "bool": {
              "must": [
                {
                  "terms": {
                    "permissions": [
                      "a",
                      "b",
                      "c"
                    ]
                  }
                }
              ],
              "must_not": [
                {
                  "terms": {
                    "permissions": [
                      "d"
                    ]
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    搜索结果:

    "hits": [
      {
        "_index": "stof_64081578",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "id": 2,
          "permissions": [
            "a"
          ]
        }
      },
      {
        "_index": "stof_64081578",
        "_type": "_doc",
        "_id": "3",
        "_score": 1.0,
        "_source": {
          "id": 3,
          "permissions": [
            "a",
            "b"
          ]
        }
      },
      {
        "_index": "stof_64081578",
        "_type": "_doc",
        "_id": "4",
        "_score": 1.0,
        "_source": {
          "id": 4,
          "permissions": [
            "a",
            "c"
          ]
        }
      }
    ]
    

    【讨论】:

    • 第一个文档检索不正确。需要用户没有的权限“d”(具有 a、b、c)。绑定表达式应该是 AND 而不是 OR,这在幕后执行。还看到我搞砸了第一个例子。应返回 ID 的 2-4。已编辑。 P.S.:有些人需要睡觉;)。
    • @JakaKonda 请仔细阅读我的更新答案,如果这解决了您的问题,请告诉我?
    • @JakaKonda 你有机会看我的回答吗,期待得到你的反馈:)
    • 它适用于特定情况,因此不能一概而论。一个用户总是有 5 个权限,大约有 500 个不同的值(它们不是权限,但用于更容易理解)。并且该文档始终拥有最多 5 个权限。
    • @JakaKonda 据我所知,没有通用的方法可以实现您所需的结果。除了上面的搜索查询,你甚至可以使用脚本
    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多