Синтаксис Elasticsearch DSL для условий фильтра - PullRequest
2 голосов
/ 09 июля 2019

У меня есть эластичный поисковый запрос, который работает с фильтром multi_match и range, но я не могу определить правильный синтаксис для добавления фильтра терминов.

Я используюasticsearch версии 7.1.0.

Это запрос, который работает:

{
    "body": {
        "query": {
            "bool": {
                "must": {
                    "multi_match": {
                        "query": "nuclear power"
                    }
                },
                "filter": {
                    "range": {
                        "displaydate": {
                            "gte": "2019-07-02T16:26:04Z"
                        }
                    }
                }
            }
        }
    }
}

Возвращает все документы из моего индекса, которые соответствуют фразе «ядерная энергия» и имеют дату отображения после 2019-07-02 16: 26.

Теперь я хочу иметь возможность фильтровать запрос, чтобы он возвращал результаты только определенного типа. В индексе есть поле с именем object_type, в котором хранится тип объекта каждого элемента в индексе.

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

Вот как я добавил фильтр терминов:

{
    "body": {
        "query": {
            "bool": {
                "must": {
                    "multi_match": {
                        "query": "nuclear power"
                    }
                },
                "filter": {
                    "terms": {
                        "object_type": [
                            "Core_Page",
                            "Module_Page"
                        ]
                    },
                    "range": {
                        "displaydate": {
                            "gte": "2019-07-02T16:16:50Z"
                        }
                    }
                }
            }
        }
    }
}

но теперь я получаю ошибку синтаксического анализа от ElasticSearch:

Elasticsearch\Common\Exceptions\BadRequest400Exception: 
{
  "error":
    {"root_cause":
        [
            {
                "type":"parsing_exception",
                "reason":"[terms] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
                "line":1,
                "col":142
             }
         ],

         "type":"parsing_exception",
         "reason":"[terms] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
         "line":1,
         "col":142
    },
    "status":400
}

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

Ответы [ 2 ]

3 голосов
/ 09 июля 2019

Если у вас есть несколько фильтров, вам нужно указать их в массиве, например так:

{
  "body": {
    "query": {
      "bool": {
        "must": {
          "multi_match": {
            "query": "nuclear power"
          }
        },
        "filter": [
          {
            "terms": {
              "object_type": [
                "Core_Page",
                "Module_Page"
              ]
            }
          },
          {
            "range": {
              "displaydate": {
                "gte": "2019-07-02T16:16:50Z"
              }
            }
          }
        ]
      }
    }
  }
}

То же самое относится к must, must_not и should

0 голосов
/ 10 июля 2019

Это рабочий код, с которым я закончил.

Я использовал «совпадение» вместо «условия», потому что я хотел сопоставить с исходным значением, а не с обработанным значением.Elasticsearch обрабатывает текстовые строки, когда индексирует их.Это строчные буквы их и удаляет пунктуацию.«Срок» сравнивается с этим обработанным значением.Сравнение сравнивается с исходным значением.

{
    "body": {
        "query": {
            "bool": {
                "must": {
                    "multi_match": {
                        "query": "nuclear power"
                    }
                },
                "filter": [
                    {
                        "bool": {
                            "should": [
                                {
                                    "match": {
                                        "object_type": "Module_Page"
                                    }
                                },
                                {
                                    "match": {
                                        "object_type": "Core_Page"
                                    }
                                }
                            ]
                        }
                    },
                    {
                        "range": {
                            "displaydate": {
                                "gte": "2019-07-03T12:54:32Z"
                            }
                        }
                    }
                ]
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...