Поиск запроса по элементам массива в Elastic Search

Я пытаюсь изучить elasticsearch с помощью простого примера приложения, в котором перечислены цитаты, связанные с людьми. Пример отображения может выглядеть так:

{ 
  "people" : {
    "properties" : {
      "name" : { "type" : "string"},
      "quotations" : { "type" : "string" }
    }
  }
}

Некоторые примеры данных могут выглядеть так:

{ "name" : "Mr A",
  "quotations" : [ "quotation one, this and that and these"
                 , "quotation two, those and that"]
}

{ "name" : "Mr B",
  "quotations" : [ "quotation three, this and that"
                 , "quotation four, those and these"]
}

Я хотел бы иметь возможность использовать querystring api для отдельных котировок и возвращать людей, которые соответствуют. Например, я могу захотеть найти людей, у которых есть цитата, содержащая (это И эти), которые должны возвращать "г-н А", но не "г-н Б" и т.д. Как я могу достичь этого?

EDIT1:

Ответ Андрея ниже, похоже, работает, теперь значения данных выглядят следующим образом:

{"name":"Mr A","quotations":[{"value" : "quotation one, this and that and these"}, {"value" : "quotation two, those and that"}]}

Однако я не могу заставить запрос query_string работать. Следующие результаты не дают результатов:

{
  "query": {
    "nested": {
      "path": "quotations",
      "query": {
        "query_string": {
            "default_field": "quotations",
            "query": "quotations.value:this AND these"
        }
      }
    }
  }
}

Есть ли способ получить запрос query_string, работающий с вложенным объектом?

Edit2: Да, см. ответ Андрея.

Ответ 1

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

{
  "mappings": {
    "people": {
      "properties": {
        "name": {
          "type": "string"
        },
        "quotations": {
          "type": "nested",
          "properties": {
            "value": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}

значения:

{"name":"Mr A","quotations":[{"value": "quotation one, this and that and these"}, {"value": "quotation two, those and that"}]}
{"name":"Mr B","quotations":[{"value": "quotation three, this and that"}, {"value": "quotation four, those and these"}]}

Query:

{
  "query": {
    "nested": {
      "path": "quotations",
      "query": {
        "bool": {
          "must": [
            { "match": {"quotations.value": "this"}},
            { "match": {"quotations.value": "these"}}
          ]
        }
      }
    }
  }
}

Ответ 2

К сожалению, нет хорошего способа сделать это. http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/complex-core-fields.html

Когда вы вернете документ из Elasticsearch, любые массивы будут тот же порядок, что и при индексировании документа. Поле _source что вы вернетесь, содержит точно такой же документ JSON, что и вы индексируются.

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

Другими словами, он всегда рассматривает все значения в массиве.

Это вернет только Mr A

{
  "query": {
    "match": {
      "quotations": {
        "query": "quotation one",
        "operator": "AND"
      }
    }
  }
}

Но это вернет как г-н А, так и г-н Б:

{
  "query": {
    "match": {
      "quotations": {
        "query": "this these",
        "operator": "AND"
      }
    }
  }
}