Elasticsearch исключает пустую строку при поиске во вложенной коллекции - PullRequest
0 голосов
/ 09 июня 2018

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

У меня есть следующая модель (назовем это response)

{
    string id, 
    int category,
    answers: [{
        string answer,
        string innerId
        int type,
    }]
}

некоторые ответы могут не иметь фактического ответа (т. Е. Поле ответа является пустой строкой).

У меня есть 2 сценария, с которыми у меня проблемы.

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

{
  "query": {
    "nested": {
      "path": "surveyResponseAnswers",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "surveyResponseAnswers.questionType": 1
              }
            }
          ]
        }
      }
    }
  }
}

Я пытался добавить

"must_not": [{
  "match": {
    "surveyResponseAnswers.answer": ""
  }
]

На том же уровне, что и must, но мне кажется, что это дает мне родительский ответ, потому что есть другие ответы, которыеиметь значение в свойстве answer, о котором мне все равно.

Мой второй случай таков, что я должен найти все вложенные объекты, которые имеют type = 1, а поле ответа содержит другую строку / подстроку, для которойя предложил следующий запрос, но он дает мне результаты только для ответов, которые соответствуют полному поисковому слову, которое у меня есть.

{
  "query": {
    "nested": {
      "path": "answers",
      "query": {
        "bool": {
          "must": [{
            "match": {
              "answers.type": 1
            }
          }, {
            "match": {
              "answers.answer": "text"
            }
          }]
        }
      }
    }
  }
}

1 Ответ

0 голосов
/ 10 июня 2018

Для первой проблемы попробуйте использовать « constant_score », а затем отфильтровать.Ваш запрос будет выглядеть следующим образом.

{
    "query": {
      "nested": {
        "path": "surveyResponseAnswers",
        "query": {
          "bool": {
            "must": [
              {
                "match": {
                  "surveyResponseAnswers.questionType": 1
                }
              },
              {
                "constant_score": {
                  "filter": {
                    "exists": {
                      "field": "surveyResponseAnswers.answer"
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }

для вашей второй проблемы попробуйте использовать " term ", если вы хотите выполнить поиск по всему слову, или " prefix ", в зависимости от того, чтовы должны.

Подробнее см. https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...