具有弹性搜索渗透的复杂查询
Complex queries with elatic search percolation
我有一个 PostgreSQL 数据库,其中包含从 Web 解析的新闻文章。解析器每小时运行一次,收集新的新闻项并将它们存储在数据库中。该应用程序的用户能够将某些关键字添加到他们的个人资料中,这样如果发现包含该关键字的新新闻条目,他们就会收到通知。目前我正在为此使用 SQL 查询,所以每当我收到一篇新的新闻文章时,我都会尝试将其与用户添加的所有关键字进行匹配,然后发送通知,但这需要很多时间。所以我在考虑集成 Elasticsearch。我遇到过 percolation query ,但我找不到关于它的好文档,所以不确定我是否能够用它创建复杂的查询。搜索需要考虑以下因素:
- 用户可以添加AND、OR、NOT关键字,我们需要分别"search for all"、"any one"、"not containing"。例如,用户可以输入像 "Bitcoin" AND "Cryptocurrency" NOT "Mining" 这样的关键字,那么在这种情况下,该搜索查询应该只匹配包含单词 "Bitcoin" 和 "Cryptocurrency" 的新闻文章并且不应包含单词 "Mining"。
关键字可以在文章标题或文章中的任何位置 body
- 词干提取。因此,如果用户关键字包含 "raining" 并且文章包含单词 "rain",则渗透搜索仍应 return 该关键字的 ID
- 用户还可以提供作者作为关键字,在这种情况下,我们需要 return 由该作者创作的文章
感谢您的精确。
要在您的案例中使用渗透查询,您必须:
- 创建一个索引,定义您的文章的映射、有关您的用户的信息以及与用户偏好相对应的过滤器查询。
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
firled 参数中使用这篇文章。如果文章已经被索引,也可以直接使用它的id(语法在文档中给出)。
GET /percolated_queries_index/_search
{
"query" : {
"percolate" : {
"field" : "query",
"document" : {
// The content of the article
}
}
}
"_source": "user"
}
对该查询的响应将 return 包含与文章文档匹配的搜索查询的文档,其中包含与该文章相对应的用户信息。由于您通常对搜索查询本身不感兴趣,因此您可以过滤以仅获取 user
字段。
对此查询的响应将为您提供新文章应发送给的所有用户。
我有一个 PostgreSQL 数据库,其中包含从 Web 解析的新闻文章。解析器每小时运行一次,收集新的新闻项并将它们存储在数据库中。该应用程序的用户能够将某些关键字添加到他们的个人资料中,这样如果发现包含该关键字的新新闻条目,他们就会收到通知。目前我正在为此使用 SQL 查询,所以每当我收到一篇新的新闻文章时,我都会尝试将其与用户添加的所有关键字进行匹配,然后发送通知,但这需要很多时间。所以我在考虑集成 Elasticsearch。我遇到过 percolation query ,但我找不到关于它的好文档,所以不确定我是否能够用它创建复杂的查询。搜索需要考虑以下因素:
- 用户可以添加AND、OR、NOT关键字,我们需要分别"search for all"、"any one"、"not containing"。例如,用户可以输入像 "Bitcoin" AND "Cryptocurrency" NOT "Mining" 这样的关键字,那么在这种情况下,该搜索查询应该只匹配包含单词 "Bitcoin" 和 "Cryptocurrency" 的新闻文章并且不应包含单词 "Mining"。 关键字可以在文章标题或文章中的任何位置 body
- 词干提取。因此,如果用户关键字包含 "raining" 并且文章包含单词 "rain",则渗透搜索仍应 return 该关键字的 ID
- 用户还可以提供作者作为关键字,在这种情况下,我们需要 return 由该作者创作的文章
感谢您的精确。
要在您的案例中使用渗透查询,您必须:
- 创建一个索引,定义您的文章的映射、有关您的用户的信息以及与用户偏好相对应的过滤器查询。
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
firled 参数中使用这篇文章。如果文章已经被索引,也可以直接使用它的id(语法在文档中给出)。
GET /percolated_queries_index/_search
{
"query" : {
"percolate" : {
"field" : "query",
"document" : {
// The content of the article
}
}
}
"_source": "user"
}
对该查询的响应将 return 包含与文章文档匹配的搜索查询的文档,其中包含与该文章相对应的用户信息。由于您通常对搜索查询本身不感兴趣,因此您可以过滤以仅获取 user
字段。
对此查询的响应将为您提供新文章应发送给的所有用户。