【问题标题】:Elasticsearch query with exclusion list带有排除列表的 Elasticsearch 查询
【发布时间】:2020-05-14 14:49:23
【问题描述】:

我还是 ES 的初学者,遇到了一个我不知道如何解决的任务。

我们有一个典型的通讯系统,它有一个索引(联系人),我们在其中存储联系信息。这些是典型的个人数据:姓名、电子邮件地址等,以及对我们很重要的问题的答案。 大多数数据类型都是简单的关键字(或日期),因为它们最适合我们的搜索。文档数量约为 100 万。

查询例如“我正在寻找居住在布达佩斯的所有 25-50 岁的女性”。 (我们的查询比这复杂得多)

GET /contact/_search
{
  "query": {
      "bool": {
        "should": [
          {
              "term": {
                  "city": "Budapest"
              }
          },
          {
              "term": {
                  "gender": "female"
              }
          },
          {
              "range": {
                  "birthdate": {
                      "lte": "1995-05-14",
                      "gte": "1970-05-14"
                  }
              }
          }
        ]
      }
  }
}

这对我们来说效果很好,速度极快。

我的问题是,如何为常规查询制作大型排除列表?

每个联系人都有一个 ID(md5 哈希或 sha256),我们想查询例如“我正在寻找所有居住在布达佩斯且 ID 不在排除名单上的 20-50 岁女性。”

排除列表目前是例如带有哈希列的 csv 文件,例如250,000 或 3,000,000 条记录。

我不知道这个列表应该如何放入数据库,也不知道应该如何在查询中引用它。

有人可以帮我吗?

【问题讨论】:

  • 一种方法是不为排除列表中的 id 索引数据(联系人列表)。这种方式减少了索引大小,不需要处理这个搜索时间
  • 如果所有查询的排除列表都相同,您可以将其转换为每个文档上的布尔字段,然后为您的查询添加过滤子句。
  • 不幸的是,排除列表永远不会相同。此排除列表类似于 SQL 中的 NOT IN, NOT EXISTS。在一个表中是联系人,在另一个表中是排除列表:SELECT c。 * FROM contact c WHERE c.age BETWEEN 20-50 AND c.city = 'Budapest' and NOT EXISTS (SELECT 1 FROM exlusion e WHERE c.md5hash = e.md5hash) 我想在elasticsearch中实现这一点。这可以用两个索引来想象吗?一个索引联系人,另一个索引排除?

标签: elasticsearch


【解决方案1】:

或者我们为排除列表 (ID) 命名。联系人对象获取一个名为 exclude 的属性,该属性将是一个列表并包含包含联系人文档的排除列表的 ID。这将使查询变得容易。它类似于标签。

例如:csv 文件中的排除列表,200,000 条记录。列表名称为 ex_20200515_xyz

{
"email": "xyz@gmail.com",
"birthday": "1975-01-01",
"city": "Budapest",
....
excludes: ["ex_20200510_rtz", "ex_20200515_xyz"]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 2018-12-08
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多