Разница между do c .field_name и field_name в Elasti c Поиск? - PullRequest
1 голос
/ 16 марта 2020

У меня есть такой источник:

{
      "doc" : {
        "questions" : [
          {
            "question" : "Which gold customers in Texas had bank accounts with more than $10 million last year ?",
            "state" : "COMPLETED",
            "tags" : [
              "computer"
            ]
          }
        ]
      }
    }

Когда я пишу запрос для поиска по состоянию и тегу, запрос выглядит так:

 {
  "size": "2000",
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "doc.questions.state": "COMPLETED"
          }
        },
        {
          "match": {
            "doc.questions.tags": "computer"
          }
        }
      ]
    }
  },
  "from": "0",
  "_source": {
    "includes": [
      "doc.questions.question",
      "doc.questions.state",
      "doc.questions.tags"
    ]
  }
}

Почему это требуется написать do c .questions.tag вместо questions.tags ?

Если я удаляю do c. из любых клавиш, ничто не соответствует

enter image description here

В чем разница?

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Помимо замечаний Камала, как правило, в ваших документах обычно используется зарезервированное ключевое слово doc!

Doc используется, например, как верхний уровень doc_values ​​ context внутри скриптов примерно так:

GET my_index/_search
{
  "script_fields": {
    "sales_price": {
      "script": {
        "lang":   "expression",
        "source": "doc['cost_price'] * markup",    <---
        "params": {
          "markup": 0.2
        }
      }
    }
  }
}

, что означает, что было бы легко спутать с do c внутри вашего фактического документа. Так что переименуйте, чтобы быть более информативным ... Все, что здесь, это "do c";)

0 голосов
/ 16 марта 2020

В основном Elasticsearch имеет два варианта JSON внутри JSON структуры , то есть типа nested или object.

В вашем случае это тип object. Вы можете проверить отображение или в терминах СУБД схему этого индекса , используя

GET <your_index_name>/_mapping

В порядке для поиска по значениям внутренней структуры json, необходимо включить по всему пути к полю в противном случае эластичный поиск будет обрабатывать questions как если это поле за пределами doc.

Таким образом, если ваша структура JSON такая, как показано ниже, она будет работать, удалив doc.

{
   "questions":[
      {
         "question":"Sample Question",
         "state":"Completed",
         "tags":[
            "computer"
         ]
      }
   ]
}

Надеюсь, теперь вы понимаете, почему вы не получите никаких результатов просто потому, что ваша структура JSON для questions начинается с doc.

Ссылки, которыми я поделился, помогут вам уточнить. Надеюсь, это поможет!

...