Как использовать параметры ElasticSearch Query (DSL-запрос) для нескольких типов? - PullRequest
15 голосов
/ 25 августа 2011

Я работал с ElasticSearch в течение последних нескольких месяцев, но все еще нахожу это сложным, когда мне нужно пройти сложный запрос.

Я хочу выполнить запрос, который должен будет искать несколько «типов», и каждый тип должен быть найден с его собственными «фильтрами», но необходимо объединить «найденные результаты»

Например:

Мне нужно найти документ «тип пользователя», который является моими друзьями, и в то же время я должен найти документ «тип объекта», который мне нравится, по предоставленному ключевому слову.

ИЛИ

Запрос, в котором есть и предложения "И", и "НЕ"

Пример запроса:

$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, но не должен иметь последователя идентификатора 32 и поклонника идентификатора 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 ]

14 голосов
/ 26 августа 2011

Возможно, вы захотите взглянуть на слайды презентации, которую я дал в этом месяце, в которой объясняются основы работы DSL-запроса:

Условия участия - объяснено в ElasticSearch Query DSL

Проблема с вашим запросом в том, что ваши фильтры вложены неправильно. Фильтры and и not находятся на одном уровне, но фильтр 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"
            }
         }
      }
   }
}
'
3 голосов
/ 26 августа 2011

Я только что попробовал с "BOOL"

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

Дает правильный ответ.

но я не уверен, что его следует использовать так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...