在 Elasticsearch 过滤器索引中查找特定查询

Find a specific query in Elasticsearch percolator index

我正在尝试查找保存在过滤器索引中的特定查询。还没有看到任何相关的文档。 其中一个 SOF question 有助于将所有查询保留在索引中。

我的一个示例查询保留在 Percolator 中

curl -XPUT "http://localhost:9200/notifications/.percolator/1" -d'
{
  "query" : {
      "match" : {
        "tags" : "elasticsearch"
      }}
}'

其他示例查询如

curl -XPUT "http://localhost:9200/notifications/.percolator/4" -d'
{
"query" : {
    "bool": {
        "should": [
           { "term": {
              "tags": "Hbase"
                }
           },
            {  "term": {
                 "user": "abc"
              }
           }
        ]
        , "minimum_number_should_match": 1
    }
}
}'

有什么方法可以提取特定查询吗?基于上面的例子,我想找到一个匹配用户的查询:"abc"

所以对于你的例子,如果我们只是将 minimum_should_match 更新为 2 而不是 1,我们将无法将过滤器 API 与

一起使用
{
    "doc" : {
        "user" : "abc"
    }
}

获取您想要的查询。

这是一个想法:

基于 Percolator Docs,过滤器索引中存储的查询的默认映射为:

{
    ".percolator" : {
        "properties" : {
            "query" : {
                "type" : "object",
                "enabled" : false
            }
        }
    }
}

您可能会使用带有适当分析器的新字段来更新此映射,这样您就可以按照自己的方式搜索查询,而无需提供文档来查找 return 文档的查询。这个新字段,比方说 custom_query_rep,可以包含您在使用过滤器为查询编制索引时指定的某种查询表示形式(类似于查询的 JSON.stringify(query) 版本)。这将允许您使用如下查询查询过滤器索引:

{
    "query" : {
        "bool" : {
            "must" : [
                { "match" : { "custom_query_rep" : "user" } },
                { "match" : { "custom_query_rep" : "abc" } }
            ]
        }
    }
}

当然这是一个非常简单的案例。该解决方案似乎有些受限,对于更复杂的查询需要更多思考。

由于Percolator类型被定义为动态的,在将查询(即文档)添加到Percolator时,我们可以将字段添加到搜索上。基于此信息,示例查询 1 将变为

curl -XPUT "http://localhost:9200/notifications/.percolator/1" -d'
{
"query" : {
    "match" : {
        "tags" : "db"
    }
},
"tags" : "db"
}'

同样,示例查询 2 将是

curl -XPUT "http://localhost:9200/notifications/.percolator/4" -d'
{
"query" : {
"bool": {
    "should": [
       {"term": {"tags": "Hbase"}},
       {"term": {"user": "abc"}}
    ]
    , "minimum_number_should_match": 1
  }}
 "tags": "hbase"
 "user": "abc" 
 }'

最后我们照常查询

curl -XPOST "http://localhost:9200/notifications/.percolator/_search" -d'
{
"query": {
  "term": {
     "user": "abc"
  }
}
}'

这个解决方案对我有用。可能有更好的解决方案。想听听专家的意见。