использование запроса query_string с bool в эластичном поиске, вызывающем исключение синтаксического анализа

Почему этот запрос дает мне исключение при синтаксическом анализе? Если я удалю bool, похоже, это сработает. Но мне нужно логическое значение там с query_string. Как я могу заставить это работать?

{
    "query": {
        "filtered": {
            "query": {
                "bool": {
                    "must": [
                        {
                            "terms": {
                                "status_type": [
                                    "5"
                                ]
                            }
                        }
                    ]
                }
            },
            "filter": {
                "query_string": {
                    "fields": [
                        [
                            "name",
                            "message"
                        ]
                    ],
                    "query": "Arnold AND Schwarz"
                }
            }
        }
    },
    "sort": [
        {
            "total_metrics": {
                "order": "desc"
            }
        }
    ]
}

person Horse Voice    schedule 03.08.2015    source источник
comment
Можете ли вы показать исключение синтаксического анализа, которое вы получаете?   -  person Val    schedule 03.08.2015


Ответы (2)


Вам следует использовать фильтр запроса который превращает любой запрос в фильтр. В противном случае вы получите ошибку синтаксического анализа, которую вы получите No filter registered for [query_string].

Вам нужно изменить часть filter на:

"filter": {
  "query": { // <- wraps a query as a filter
    "query_string": {
      "fields": [
        [
          "name",
          "message"
        ]
      ],
      "query": "Arnold AND Schwarz"
    }
  }
}

@Edit: поскольку я вижу, что у людей могут возникнуть проблемы с замечанием того, что я вставил только измененную часть всего запроса, включая часть filter (а не весь filtered), вот все после модификации:

{
    "query": {
        "filtered": {
            "query": {
                "bool": {
                    "must": [
                        {
                            "terms": {
                                "status_type": [
                                    "5"
                                ]
                            }
                        }
                    ]
                }
            },
            "filter": {
                "query": { // <- the only difference!
                    "query_string": {
                        "fields": [
                            [
                                "name",
                                "message"
                            ]
                        ],
                        "query": "Arnold AND Schwarz"
                    }
                }
            }
        }
    },
    "sort": [
        {
            "total_metrics": {
                "order": "desc"
            }
        }
    ]
}
person Mateusz Dymczyk    schedule 03.08.2015
comment
Как бы я включил bool? вы не предоставили логический запрос в примере - person Horse Voice; 03.08.2015
comment
@HorseVoice заметил, что я изменил только часть filter, а не всю filtered, просто замените вашу filter часть всего запроса тем, что я показал. - person Mateusz Dymczyk; 03.08.2015
comment
Потрясающий!! есть ли какой-нибудь блог или руководство, которое просто объясняет, что и во что может входить? Я имею в виду, например, что меня смущает, может ли запрос перейти в логическое значение, или фильтр может перейти в запрос, или логическое значение может перейти в фильтр и т. д. Действительно запутанно. И в документации эти правила формулировки запросов не описаны должным образом. Должен ли я открыть новый вопрос в этой теме, и вы можете ответить там? Я выберу ваш ответ и там. Дай мне знать. Благодарю вас! - person Horse Voice; 03.08.2015
comment
@HorseVoice, на самом деле, лично я всегда использовал их документацию и находил ее довольно разумной, но, может быть, потому, что я все это прочитал? Я имею в виду, что у них нет большой избыточности данных, и если вы не прочитаете все это внимательно, вы действительно пропустите много важной информации. - person Mateusz Dymczyk; 03.08.2015
comment
Позвольте мне опубликовать новый вопрос по этой конкретной теме. Поскольку я новичок в этом, я надеюсь, что это быстро приведет меня к скорости. Благодарность - person Horse Voice; 03.08.2015
comment
Я разместил вопрос. Видите ли, мне приходится читать документацию для каждого запроса, но на самом деле я пытаюсь написать внутренний sql, такой как API, который создаст эластичный dsl. Поэтому мне нужны определенные правила для того, что происходит в эластичном запросе. - person Horse Voice; 03.08.2015

Исключение синтаксического анализа, которое вы получите, должно сказать вам что-то вроде No filter registered for [query_string]

На самом деле query_string фильтра нет, зато есть query_string запрос. Итак, если вы поменяете фильтр и запрос, он будет работать:

{
  "query": {
    "filtered": {
      "query": {
        "query_string": {         <--- move query_string in the query part
          "fields": [
            [
              "accountIdentifier",
              "accountName"
            ]
          ],
          "query": "Arnold AND Schwarz"
        }
      },
      "filter": {
        "bool": {                 <--- move the bool in the filter part
          "must": [
            {
              "terms": {
                "quantity": [
                  "5"
                ]
              }
            }
          ]
        }
      }
    }
  },
  "sort": [
    {
      "total_metrics": {
        "order": "desc"
      }
    }
  ]
}
person Val    schedule 03.08.2015
comment
Я разместил вопрос. Видите ли, мне приходится читать документацию для каждого запроса, но на самом деле я пытаюсь написать внутренний sql, такой как API, который создаст эластичный dsl. Поэтому мне нужны правила, определенные для того, что происходит в эластичном запросе. - person Horse Voice; 03.08.2015