【问题标题】:Complex queries with elatic search percolation具有弹性搜索渗透的复杂查询
【发布时间】:2019-11-13 04:14:21
【问题描述】:

我有一个 PostgreSQL 数据库,其中包含从网络上解析的新闻文章。解析器每小时运行一次,收集新的新闻并将它们存储在数据库中。该应用程序的用户可以将某些关键字添加到他们的个人资料中,这样如果发现包含该关键字的新新闻项目,他们就会收到通知。目前我正在为此使用 SQL 查询,所以每当我收到一篇新的新闻文章时,我都会尝试将其与用户添加的所有关键字进行匹配,然后发出通知,但这需要很多时间。所以我正在考虑整合 Elasticsearch。我遇到了 percolation query ,但我找不到关于它的好的文档,所以不确定我是否能够用它创建复杂的查询。搜索需要考虑以下几点:

  1. 用户可以添加关键字AND、OR、NOT,我们需要分别“搜索所有”、“任何一个”、“不包含”。例如,用户可以给出诸如“比特币”和“加密货币”之类的关键字而不是“采矿”,那么在这种情况下,这个搜索查询应该只匹配包含“比特币”和“加密货币”字样的新闻文章,并且不应该包含“采矿”字样。 关键字可以是文章标题或文章正文中的任何位置
  2. 词干。因此,如果用户关键字包含“raining”并且文章包含单词“rain”,那么渗透搜索仍应返回该关键字的 id
  3. 用户还可以提供作者作为关键字,在这种情况下,我们需要返回由该作者撰写的文章

【问题讨论】:

  • 我不明白为什么渗透查询可以解决您的问题。它们用于将查询存储在索引中,而不是直接将它们发送到 elasticsearch。就您而言,我相信您可以使用标准搜索查询或搜索模板。第 2 点和第 3 点应该易于实施。 1.你的要求不明确。
  • 从我到现在的理解。简而言之,渗透器允许您做的就是索引您的查询并根据索引查询过滤文档以了解它们匹配哪些查询。它也称为反向搜索,因为您所做的与您习惯的相反。其中一个博客中给出的用例之一是 - “任何存储用户兴趣以便将正确内容发送给正确用户的平台只要它进来”。这正是我想要实现的目标。就我而言,用户兴趣基本上是关键词

标签: elasticsearch elasticsearch-percolate


【解决方案1】:

感谢您的精确。

要在您的情况下使用渗透查询,您必须:

  1. 创建一个索引,定义您的文章的映射、有关您的用户的信息以及与用户偏好相对应的过滤器查询。
PUT /percolated_queries_index
{
    "mappings": {
        "properties": {
            "article": {
                // Mapping for your article
            },
            "query": {
                "type": "percolator"
            },
            "user": {
                // Mapping for the information related to the user
            }
        }
    }
}

article 字段是必需的,因为您将渗透的文章文档将使用此映射。这可能与您在article 索引中使用的映射相同。正如文档中提到的,您应该将此映射视为您将匹配的文档的预处理。例如,您必须在此处指定词干分析器。

  1. percolator 字段中为每个用户索引与其用户偏好相对应的搜索查询。
PUT /percolated_queries_index/_doc
{
    "query" : {
        // The elasticsearch query corresponding to the user preferences
    },
    "user": {
        // Information for the user, e.g., id, email
    }
}

查询对应于重写为弹性搜索查询的用户偏好。例如,文章作者的匹配查询和 AND、OR、NOT 关键字的布尔查询。这可能是困难的部分,因为您必须编写一些将用户查询转换为弹性搜索查询的内容。如果可以使用query string 语法,应该会容易很多。

您不应在此处设置article 字段。

  1. 当新文章被索引时,在document firled 参数中使用这篇文章运行percolate 搜索查询。如果文章已经被索引,也可以直接使用它的id(语法在文档中给出)。
GET /percolated_queries_index/_search
{
    "query" : {
        "percolate" : {
            "field" : "query",
            "document" : {
                // The content of the article
            }
        }
    }
    "_source": "user"
}

对该查询的响应将返回包含与文章文档匹配的搜索查询的文档,该文章文档包括与该文章对应的用户信息。由于您通常对搜索查询本身不感兴趣,因此您可以过滤以仅获取 user 字段。

对该查询的响应将为您提供新文章应发送给的所有用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多