Упругий поиск 5 - как запросить тип данных объекта и вложенный массив json

Я хочу выполнить запрос к вложенным данным, уже загруженным в Elasticsearch 5, но каждый запрос ничего не возвращает. Данные имеют тип данных объекта и вложенный массив json.

Это вложенный тип данных, т.е. массив j_ team_members:

[{
"id": 6,
"name": "mike",
"priority": 1
}, {
"id": 7,
"name": "james",
"priority": 2
}]

Этот тип данных объекта, т.е.

{
"monday": {
    "on": true,
    "end_time": "15",
    "start_time": "9",
    "end_time_unit": "pm",
    "start_time_unit": "am",
    "events_starts_every": 10
}
}

Это моя карта поиска:

{
"meetings_development_20170716013030509": {
    "mappings": {
        "meeting": {
            "properties": {
                "account": {"type": "integer"},
                "availability_slot": {
                    "properties": {
                        "monday": {
                            "properties": {
                                "end_time": {"type": "text"},
                                "end_time_unit": {"type": "text"},
                                "events_starts_every": {
                                      "type":"integer"
                                },
                                "on": {"type": "boolean"},
                                "start_time": {"type": "text"},
                                "start_time_unit": {
                                   "type": "text"
                                }
                            }
                        }
                    }
                },
                "team_members": {
                    "type": "nested",
                    "properties": {
                        "id": {"type": "integer"},
                        "name": {"type": "text"},
                        "priority": {"type": "integer"}
                    }
                }
            }
        }
    }
 }
}

У меня есть два запроса, которые не работают по разным причинам:

query 1 Этот запрос возвращает число ноль, несмотря на записи, существующие в asticsearch, я обнаружил, что запросы не выполняются из-за фильтра:

curl -u elastic:changeme http://172.19.0.4:9200/meetings_development/_search?pretty -d '{"query":{"nested":{"path":"team_members","score_mode":"avg","query":{"bool":{"must":[{"match":{"team_members.name":"mike"}},{"match":{"team_members.priority":1}}],"filter":[{"match":{"account":1}}]}}}}}'

Это возвращает нулевой результат:

{
"took" : 8,
"timed_out" : false,
"_shards" : {
  "total" : 5,
  "successful" : 5,
  "failed" : 0
},
"hits" : {
  "total" : 0,
  "max_score" : null,
  "hits" : [ ]
 }
}

запрос 1 без фильтра. Тот же запрос сверху без фильтра работает:

curl -u elastic:changeme http://172.19.0.4:9200/meetings_development/_search?pretty -d '{"query":{"nested":{"path":"team_members","score_mode":"avg","query":{"bool":{"must":[{"match":{"team_members.name":"mike"}},{"match":{"team_members.priority":1}}]}}}}}'

Запрос выше возвращает 3 попадания:

{
"took" : 312,
"timed_out" : false,
"_shards" : {
  "total" : 5,
  "successful" : 5,
  "failed" : 0
},
"hits" : {
  "total" : 3,
  "max_score" : 2.1451323,
  "hits" : [{**results available here**} ]
 }
}

запрос 2 для типа данных объекта

curl -u elastic:changeme http://172.19.0.4:9200/meetings_development/_search?pretty -d '{"query":{"bool":{"must":{"match":{"availability_slot.start_time":1}},"filter":[{"match":{"account":1}}]}}}'

Запрос возвращает совпадение с нулем, но данные находятся в эластичном поиске:

{
"took" : 172,
"timed_out" : false,
"_shards" : {
  "total" : 5,
  "successful" : 5,
  "failed" : 0
},
"hits" : {
  "total" : 0,
  "max_score" : null,
  "hits" : [ ]
 }
}

Как заставить оба запроса работать с фильтрацией по аккаунту. Спасибо

1 ответ

Решение

Эта направляющая ссылка elavesearch была очень полезна при поиске правильных запросов на alesearch, показанных ниже:

запрос 1 для вложенного массива JSON

 {
  "query" => {

 "bool": {
  "must": [
   {
    "match": {
      "name": "sales call"
    }
   },
   {"nested" => {
  "path" => "team_members",
  "score_mode" => "avg",
  "query" => {
    "bool" => {
      "must" => {
        "match" => {"team_members.name" => "mike"} 
      }
    }
   }
  }
 }
 ],
  "filter": {
    "term": {
      "account": 1
    }
   }
  },


 }
}

Просто передайте запрос к упругому поиску следующим образом:

curl http://172.19.0.4:9200/meetings_development/_search?pretty -d '{"query":{"bool":{"must":[{"match":{"name":"sales call"}},{"nested":{"path":"team_members","score_mode":"avg","query":{"bool":{"must":{"match":{"team_members.name":"mike"}}}}}}],"filter":{"term":{"account":1}}}}}'

правильный синтаксис для запроса 2 для типа данных объекта, то есть json

 {
   "query": {
     "bool": {
       "must": { 
          "match": {'availability_slot.monday.start_time' => '9'} 
       },
     "filter": [{
          "match":  {'account': 1}
     }]
   }
 }
}

Вы передаете это в asticsearch вот так:

curl http://172.19.0.4:9200/meetings_development/_search?pretty -d '{"query":{"bool":{"must":{"match":{"availability_slot.monday.start_time":"9"}},"filter":[{"match":{"account":1}}]}}}'
Другие вопросы по тегам