【发布时间】: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