15

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

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

例如:

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

或者

同时具有“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”,但它不应该只是结果中的第二个。

有任何想法吗?

4

2 回答 2

14

您可能想看一下我本月提供的演示文稿的幻灯片,它解释了查询 DSL 工作原理的基础知识:

爱戴条款 - ElasticSearch Query DSL 解释

您的查询的问题是您的过滤器嵌套不正确。和过滤器处于同一级别,但and过滤器应位于:notnotand

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"
            }
         }
      }
   }
}
'
于 2011-08-26T08:32:37.867 回答
3

我刚用“BOOL”试了一下

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

它给出了正确的答案。

但我不确定它应该这样使用吗?

于 2011-08-26T19:39:39.803 回答