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

У меня есть следующее отображение в моем индексе:

{
  "index": {
    "mappings": {
      "shop": {
        "properties": {
          "about": {
            "type": "text"
          },
          "address": {
            "type": "text"
          },
          "description": {
            "type": "text"
          },
          "email": {
            "type": "text"
          },
          "location": {
            "type": "geo_point"
          },
          "name": {
            "type": "text"
          },
          "operationHours": {
            "type": "nested",
            "include_in_parent": true,
            "properties": {
              "dayOfWeek": {
                "type": "long"
              },
              "timeRanges": {
                "type": "nested",
                "include_in_parent": true,
                "properties": {
                  "from": {
                    "type": "long"
                  },
                  "to": {
                    "type": "long"
                  }
                }
              }
            }
          },
          "phone": {
            "type": "text"
          },
          "profileImageName": {
            "type": "text"
          }
        }
      }
    }
  }
}

Затем я добавил следующий документ:

{
    "operationHours": [
      {
        "timeRanges": [
          {
            "to": 720,
            "from": 600
          },
          {
            "to": 1500,
            "from": 840
          }
        ],
        "dayOfWeek": 0
      },
      {
        "timeRanges": [
          {
            "to": 720,
            "from": 700
          },
          {
            "to": 960,
            "from": 840
          }
        ],
        "dayOfWeek": 2
      },
      {
        "timeRanges": [
          {
            "to": 720,
            "from": 600
          },
          {
            "to": 1500,
            "from": 840
          }
        ],
        "dayOfWeek": 4
      },
      {
        "timeRanges": [
          {
            "to": 720,
            "from": 600
          },
          {
            "to": 1500,
            "from": 840
          }
        ],
        "dayOfWeek": 5
      },
      {
        "timeRanges": [
          {
            "to": 720,
            "from": 600
          },
          {
            "to": 1500,
            "from": 840
          }
        ],
        "dayOfWeek": 6
      },
      {
        "timeRanges": [
          {
            "to": 720,
            "from": 600
          },
          {
            "to": 1500,
            "from": 840
          }
        ],
        "dayOfWeek": 7
      }
    ],
    "location": {
      "lon": "-68.72307",
      "lat": "25.463178"
    },
    "profileImageName": "ACRUEX.jpg",
    "address": "620 Classon Avenue, Hendersonville, Mississippi, 4076",
    "description": "Tempor culpa dolore Lorem fugiat dolore esse. Ullamco ipsum dolore amet dolor laboris eu nisi consequat Lorem non mollit minim exercitation. Voluptate ipsum mollit culpa aute sunt consectetur minim anim cupidatat dolor quis labore do amet. Non id voluptate dolore nostrud laboris voluptate consequat aliqua labore.",
    "about": "Non labore culpa do consectetur fugiat velit. Reprehenderit cupidatat nulla veniam exercitation adipisicing amet. Mollit irure voluptate dolor est veniam nulla fugiat elit. Non et deserunt excepteur non officia enim non voluptate qui amet adipisicing quis enim exercitation.",
    "email": "undefined.undefined@undefined.io",
    "phone": "+1 (833) 575-2171",
    "name": "ISOPOP"
}

Затем я использую следующий запрос для получения документов, у которых диапазон рабочих часов больше или равен указанному времени (730 в примере).

730 представляет минуты с полуночи, то есть 730 - 12:10.

GET index/shop/1/_explain
{   
   "query": { 
     "nested" : {
       "path" : "operationHours",
       "query": {
         "bool" : {
           "must" : [
             { "match" : { "operationHours.dayOfWeek" : 2 } },
             { "range": {"operationHours.timeRanges.from": { "lte": 730 }}},
             { "range": {"operationHours.timeRanges.to": { "gt": 730 }}}
                ]
             
         }
         
       }
     }
   }
}

Он подходит как совпадение и не должен этого делать, поскольку значение «730» не попадает в диапазоны от 700 до 720 и от 840 до 960.

Любая помощь относительно того, где я иду не так, была бы велика.

0
TheDaveJay 4 Апр 2017 в 15:28

2 ответа

Лучший ответ

Я понял. Следующее делает именно то, что мне нужно, чтобы сделать

{
"query": {
    "nested": {
        "path": "operationHours",
        "query": {
            "bool": {
                "must": [{
                    "match": {
                        "operationHours.dayOfWeek": 2
                    }
                }, {
                    "nested": {
                        "path": "operationHours.timeRanges",
                        "query": {
                            "bool": {
                                "must": [{
                                        "range": {
                                            "operationHours.timeRanges.to": {
                                                "gt": 600
                                            }
                                        }
                                    }, {
                                        "range": {
                                            "operationHours.timeRanges.from": {
                                                "lte": 600
                                            }
                                        }
                                    }

                                ]
                            }
                        }
                    }
                }]
            }

        }
    }
}

}

0
TheDaveJay 4 Апр 2017 в 14:22

«Он подходит как совпадение и не должен делать, так как значение« 730 »не попадает в диапазоны от 700 до 720 и от 840 до 960».

Это правильный запрос, чтобы проверить, соответствует ли документ рабочим часам для заданных диапазонов от 700 до 720 и от 840 до 960. (я рассматриваю ИЛИ между ними), и ваш документ не будет соответствовать этому запросу.

{
    "query": {
        "nested": {
            "path": "operationHours",
            "query": {
                "bool": {
                    "must": [{
                        "match": {
                            "operationHours.dayOfWeek": 2
                        }
                    }, {
                        "bool": {
                            "should": [{
                                    "range": {
                                        "operationHours.timeRanges.from": {
                                            "lt": 720,
                                            "gt": 700
                                        }
                                    }
                                }, {
                                    "range": {
                                        "operationHours.timeRanges.from": {
                                            "lt": 840,
                                            "gt": 960
                                        }
                                    }
                                }

                            ],
                            "minimum_number_should_match": 1
                        }
                    }]

                }

            }
        }
    }
}

Вы можете настроить gt to gte в соответствии с вашим вариантом использования.

0
user3775217 4 Апр 2017 в 12:39