2016-06-23 1 views
1
GET dspdocs/_search 
{ 
"query": { 
    "filtered": { 
    "filter": { 
     "bool": { 
     "must": ["must_term1", "must_term2"], 
     "must_not": ["must_not_term", "must_not_term2"] 
     } 
     }, 
    "query": { 
     "match": { 
     "text": { 
      "query": "query_term", 
      "operator": "or" 
     } 
     } 
    } 
    } 
} 
} 

Я пытаюсь выполнить приведенный выше запрос, и я получаю следующее сообщение об ошибке:Отфильтрованной ошибка запроса

"type": "query_parsing_exception", 
"reason": "[_na] query malformed, must start with start_object", 

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

Я в основном пытаюсь отфильтровать все документы, которые не содержат обязательных терминов, и содержать условия must_not. Затем я выполняю поиск в пределах отфильтрованного набора для всех документов, у которых есть query_term.

(я делаю фильтрацию первой, чтобы увеличить скорость поиска незначительно)

+0

Не могли бы вы дали пример '' must_term1' и must_not_term'? Являются ли они терминами запросов или просто 'query_term'? – keety

+0

Это просто строки, просто необходимые для преобразования их в термины, такие как pickypg, показанные ниже, и это работает! –

ответ

3

Ваш вопрос находится в примере:

... 
    "bool": { 
    "must": ["must_term1", "must_term2"], 
    "must_not": ["must_not_term", "must_not_term2"] 
    } 
    }, 
... 

Массив must и must_notshould и filter для этого вопрос) ожидает либо один объект, либо массив объектов. Например:

"bool": { 
    "must": [ 
    { 
     "term" : { 
     "my_field" : "must_term1" 
     } 
    }, 
    { 
     "term" : { 
     "my_field" : "must_term2" 
     } 
    } 
    ], 
    "must_not": [ 
    { 
     "term" : { 
     "my_field" : "must_not_term" 
     } 
    }, 
    { 
     "term" : { 
     "my_field" : "must_not_term2" 
     } 
    } 
    ] 
} 

Обратите внимание, что я использую term запрос, но вы можете использовать любой тип запроса. С Elasticsearch 2.x +, вы должны написать это в качестве чистого bool запроса, а не filtered один:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "query_string" : { 
      "query" : "query_term" 
      } 
     } 
     ], 
     "must_not": [ 
     { 
      "term" : { 
      "my_field" : "must_not_term" 
      } 
     }, 
     { 
      "term" : { 
      "my_field" : "must_not_term2" 
      } 
     } 
     ], 
     "filter": [ 
     { 
      "term" : { 
      "my_field" : "must_term1" 
      } 
     }, 
     { 
      "term" : { 
      "my_field" : "must_term2" 
      } 
     } 
     ] 
    } 
    } 
} 
+0

безупречный спасибо! –

Смежные вопросы