如何使用ElasticSearch查询参数(DSL查询)多种类型?

时间:2011-08-25 17:43:09

标签: elasticsearch

我过去几个月一直在使用ElasticSearch,但在我必须传递复杂查询时仍然觉得很复杂。

我想运行必须搜索多个“类型”的查询,并且必须使用自己的“过滤器”搜索每个类型,但需要合并“搜索结果”

例如:

我需要搜索我的朋友的“用户类型”文档,同时我必须根据提供的关键字搜索我喜欢的“对象类型”文档。

OR

具有“AND”和“NOT”子句的查询

示例查询:

$options['query'] = array(
        'query' => array(
            'filtered' => array(
                'query' => array(
                    'query_string' => array(
                        'default_field' => 'name',
                        'query' => $this->search_term . '*',
                    ),
                ),
                'filter' => array(
                    'and' => array(
                        array(
                            'term' => array(
                                'access_id' => 2,
                            ),
                        ),
                    ),

                    'not' => array(
                        array(
                            'term' => array(
                                'follower' => 32,
                            ),
                        ),

                        array(
                            'term' => array(
                                'fan' => 36,
                            ),
                        ),
                    ),
                ),
            ),
        ),
    );

因为此查询旨在搜索具有access_id = 2的用户,但不得拥有id 32的粉丝和id 36的粉丝

但这不起作用..

编辑:修改后的查询

{
  "query": {
    "filtered": {
      "filter": {
        "and": [
          {
            "not": {
              "filter": {
                "and": [
                  {
                    "query": {
                      "query_string": {
                        "default_field": "fan",
                        "query": "*510*"
                      }
                    }
                  },
                  {
                    "query": {
                      "query_string": {
                        "default_field": "follower",
                        "query": "*510*"
                      }
                    }
                  }
                ]
              }
            }
          },
          {
            "term": {
              "access_id": 2
            }
          }
        ]
      },
      "query": {
        "field": {
          "name": "xyz*"
        }
      }
    }
  }
}

现在运行此查询后,我得到两个结果,一个跟随者:“34,518”&粉丝:“510”,第二个粉丝:“34”,但它不应该只是结果中的第二个。

有什么想法吗?

2 个答案:

答案 0 :(得分:14)

您可能希望查看我本月发布的演示文稿的幻灯片,其中介绍了查询DSL如何工作的基础知识:

Terms of endearment - the ElasticSearch Query DSL explained

您的查询存在的问题是您的过滤器嵌套不正确。 andnot过滤器属于同一级别,但not过滤器应位于and下:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "filtered" : {
         "filter" : {
            "and" : [
               {
                  "not" : {
                     "filter" : {
                        "and" : [
                           {
                              "term" : {
                                 "fan" : 36
                              }
                           },
                           {
                              "term" : {
                                 "follower" : 32
                              }
                           }
                        ]
                     }
                  }
               },
               {
                  "term" : {
                     "access_id" : 2
                  }
               }
            ]
         },
         "query" : {
            "field" : {
               "name" : "keywords to search"
            }
         }
      }
   }
}
'

答案 1 :(得分:3)

我刚试过“BOOL”

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "access_id": 2
          }
        },
        {
          "wildcard": {
            "name": "xyz*"
          }
        }
      ],
      "must_not": [
        {
          "wildcard": {
            "follower": "*510*"
          }
        },
        {
          "wildcard": {
            "fan": "*510*"
          }
        }
      ]
    }
  }
}

它给出了正确答案。

但我不确定它是否应该像这样使用?