我有一个PostgreSQL数据库,其中包含从网上解析的新闻报道。解析器每小时运行一次,并收集新的新闻项并将其存储在DB中。该应用程序的用户可以将某些关键字添加到他们的个人资料中,这样,如果发现包含该关键字的新新闻项,则将通知他们。当前,我正在为此使用SQL查询,因此,每当我收到新的新闻文章时,我都会尝试将其与用户添加的所有关键字进行匹配,然后发出通知,但这会花费很多时间。所以我在考虑整合Elasticsearch。我遇到过percolation query,但是找不到关于它的好的文档,所以不确定是否可以使用它创建复杂的查询。搜索需要考虑以下因素:
答案 0 :(得分:0)
感谢您的精确度。
要在您的情况下使用渗滤查询,您必须:
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
索引中使用的映射相同。如文档中所述,您应该将此映射视为对要匹配的文档的预处理。例如,您将必须在此处指定一个词干分析器。
percolator
字段中为每个用户在其查询条件中为其搜索索引编制索引。PUT /percolated_queries_index/_doc
{
"query" : {
// The elasticsearch query corresponding to the user preferences
},
"user": {
// Information for the user, e.g., id, email
}
}
该查询对应于重写为Elasticsearch查询的用户首选项。例如,对文章作者的匹配查询和对AND,OR,NOT关键字的布尔查询。这可能是困难的部分,因为您将不得不编写一些将用户查询转换为Elasticsearch查询的内容。如果可以使用query string语法,应该会更容易。
您不应在此处设置article
字段。
percolate
固定参数中使用此文章运行document
搜索查询。如果文章已被索引,您也可以直接使用其ID(语法在文档中给出)。GET /percolated_queries_index/_search
{
"query" : {
"percolate" : {
"field" : "query",
"document" : {
// The content of the article
}
}
}
"_source": "user"
}
对此查询的响应将返回包含搜索查询的文档,该搜索查询与包含与文章相对应的用户信息的文章文档匹配。由于您通常对搜索查询本身不感兴趣,因此可以进行过滤以仅获取user
字段。
对此查询的响应将为您提供应将新文章发送给的所有用户。