Как использовать параметры запроса ElasticSearch (запрос DSL) для нескольких типов?

Я работаю с 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», но разве он не должен быть вторым в результате.

Есть идеи?

15
задан TylerH 16 July 2015 в 04:10
поделиться