【问题标题】:Search for queries into .percolator type搜索 .percolator 类型的查询
【发布时间】:2016-11-25 20:42:29
【问题描述】:

我有一个 Elasticsearch v2.4.2 索引,我正在用一堆查询和一些特殊值填充它的 .percolator 类型。查询文档如下所示:

"query" : {
      "query_string" : {
        "fields" : [ "title", "meta" ],
        "query" : "notebooks AND clamps"
      },
      "key_id" : 14,
      "owner_id" : 481,
      "priority" : 50,
      "special_id" : 477
    }

我正在尝试从 .percolator 中删除其中的一些查询,特别是那些具有“key_id”值的查询。

问题是我试图在 .percolator 上执行搜索,但没有得到结果。例如,我尝试了这些 curl 调用:

curl 'localhost:9200/percolate_index_d/.percolator/_search?q=key_id:14&pretty'


curl 'localhost:9200/percolate_index_d/.percolator/_search?&pretty' -d '{ query:{filtered:{filter:{term:{"key_id":"14"}}}} }'

但我总是这样:

 {
      "took" : 6,
      "timed_out" : false,
      "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
      },
      "hits" : {
        "total" : 0,
        "max_score" : null,
        "hits" : [ ]
      }
    }

我什至尝试过使用query.key_id,但没有运气。不确定我是否做错了什么,是否可以搜索 .percolator 类型,或者是否有一些解决方法。

【问题讨论】:

    标签: elasticsearch indices elasticsearch-percolate


    【解决方案1】:

    您上面的查询根本不正确。尝试对你的索引运行它,你会发现你有语法错误。

    查询的正确语法如下:

    {
      "query": {
        "bool": {
          "must": {
            "query_string": {
              "fields": [
                "title",
                "meta"
              ],
              "query": "notebooks AND clamps"
            }
          },
          "filter": [
            {
              "term": {
                "key_id": 14
              }
            },
            {
              "term": {
                "owner_id": 481
              }
            },
            {
              "term": {
                "priority": 50
              }
            },
            {
              "term": {
                "special_id": 477
              }
            }
          ]
        }
      }
    }
    

    然后您就可以像这样使用key_id: 14 搜索查询:

    curl 'localhost:9200/percolate_index_d/.percolator/_search?q=query.bool.filter.term.key_id:14&pretty'
    

    更新

    您的查询的元数据key_id|owner_id|priority|special_id 字段没有设置在正确的位置,您需要将它们设置在query 字段之外,像这样_

    {
      "query" : {
        "query_string" : {
          "fields" : [ "title", "meta" ],
          "query" : "notebooks AND clamps"
        }
      },
      "key_id" : 14,
      "owner_id" : 481,
      "priority" : 50,
      "special_id" : 477
    } 
    

    这样做后,您将能够检索您的查询

    curl 'localhost:9200/percolate_index_d/.percolator/_search?q=key_id:14&pretty'
    

    【讨论】:

    • 感谢您的回答。问题是我不想按 key_id|owner_id|priority|special_id 过滤。我上面的查询只是一个 .percolator 查询文档。我添加了诸如“key_id”之类的值,以便在找到与“_percolate”API 匹配时使用它们。查询与_percolate 可以正常工作,但我需要在 key_id 的 .percolator 类型(例如)查询文档中进行搜索
    • 好的,抱歉,我误解了您最初的需求。我认为 key_id|owner_id|priority|special_id 也应该是您查询的术语过滤器,但您只是将它们添加为查询的元数据字段。我已经相应地更新了我的答案。
    • 非常感谢,它按预期工作!你知道为什么它不像以前那样工作吗,“query.key_id=14”?
    • 因为正如我在回答中所说,您添加的任何元数据字段都需要超出query 对象,因此如果key_id 位于顶层,则无法查询query.key_id你的文件。
    猜你喜欢
    • 1970-01-01
    • 2015-01-10
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多