исключение синтаксического анализа эластичного поискового запроса при добавлении фильтра терминов

Я не совсем понимаю, почему термин filter "term": {"language": "Austrian"} вызывает исключение эластичного разбора поиска.

Удивительно то, что это работает, если я удалю запрос query_string. Куда бы я поставил "term": {"language": "Austrian"} фильтр, если он туда не идет?

{
  "query": {
    "filtered": {
      "query": {
        "bool": {
          "must": [
            {
              "terms": {
                "status_type": [
                  "1",
                  "2",
                  "7"
                ]
              }
            }
          ]
        }
      },
      "filter": {
        "query": {
          "query_string": {
            "fields": [
              [
                "name",
                "message"
              ]
            ],
            "query": "Arnold AND Schwarz"
          }
        },
        "term": {                <-- Causes parse exception
          "language": "Austrian"
        }
      }
    }
  },
  "sort": [
    {
      "total": {
        "order": "desc"
      }
    }
  ]
}

person Horse Voice    schedule 05.08.2015    source источник


Ответы (1)


Внутри вашего filter вам нужен фильтр bool если у вас более одного ограничения, как в вашем случае, поскольку у вас есть query filter и termфильтр. Итак, правильный способ сделать это так:

{
  "query": {
    "filtered": {
      "query": {
        "bool": {
          "must": [
            {
              "terms": {
                "status_type": [
                  "1",
                  "2",
                  "7"
                ]
              }
            }
          ]
        }
      },
      "filter": {
        "bool": {               <---- add this
          "must": [             <---- and this
            {
              "query": {
                "query_string": {
                  "fields": [
                    [
                      "name",
                      "message"
                    ]
                  ],
                  "query": "Arnold AND Schwarz"
                }
              }
            },
            {
              "term": {
                "language": "Austrian"
              }
            }
          ]
        }
      }
    }
  },
  "sort": [
    {
      "total": {
        "order": "desc"
      }
    }
  ]
}

Однако, если я могу что-то добавить, я бы переписал ваш запрос немного по-другому и переместил query_string в часть query, а status_type term в часть filter, это было бы более «естественно». Кроме того, в вашей части query вам не нужен bool/must, если у вас есть только одно ограничение.

{
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "fields": [
            [
              "name",
              "message"
            ]
          ],
          "query": "Arnold AND Schwarz"
        }
      },
      "filter": {
        "bool": {
          "must": [
            {
              "terms": {
                "status_type": [
                  "1",
                  "2",
                  "7"
                ]
              }
            },
            {
              "term": {
                "language": "Austrian"
              }
            }
          ]
        }
      }
    }
  },
  "sort": [
    {
      "total": {
        "order": "desc"
      }
    }
  ]
}
person Val    schedule 06.08.2015
comment
Превосходно. Спасибо Вал! - person Horse Voice; 06.08.2015