Prowadzę to zapytanie:

curl -X GET "localhost:9200/mydocs/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": { 
    "bool" : { "must" : [{"wildcard": {"guid": "14744*"}}, {"range": {"availability.start": {"lt": "now"}}}] }
  }
}
'

Następnie otrzymuję tę odpowiedź:

"hits" : [
  {
    "_index" : "mydocs",
    "_type" : "_doc",
    "_id" : "14744",
    "_score" : 2.0,
    "_source" : {
      "guid" : "14744",
      "availability" : {
        "start" : "2021-03-28T22:00:00.000Z",
        "end" : "2021-12-31T22:59:00.000Z"
      },
      "title" : "Some title"
    }
  }
]

Właściwie chcę wyniki, w których dzisiaj jest w zakresie dostępności i zakończenia. Powyższe wyniki twierdzą, że dokument jest dostępny między

2021-03-28T22:00:00.000Z
and
2021-12-31T22:59:00.000Z

Dzisiaj jest 2021-04-15: 15: 00.000Z

Więc co powinienem zrobić, to dodać:

{"range": {"availability.end": {"gt": "now"}}}

Czy to nie jest poprawne? Ale kiedy biegam:

curl -X GET "localhost:9200/mydocs/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "query": { 
    "bool" : { "must" : [{"wildcard": {"guid": "14744*"}}, {"range": {"availability.start": {"lt": "now"}}}, {"range": {"availability.end": {"gt": "now"}}}] }
  }
}
'   

Mam pustą listę hitów.

Częściowe mapowanie:

{
mappings: {
    _doc: {
        properties: {
            availability: {
                properties: {
                    end: {
                        type: "keyword"
                    },
                    start: {
                        type: "keyword"
                    }
                }
            },
        properties: {
            guid: {
                type: "keyword"
            }
        }
    }       
}
}       
0
oderfla 15 kwiecień 2021, 16:01

1 odpowiedź

Najlepsza odpowiedź

Twoje zapytanie jest całkowicie poprawne! Dobra robota z tym!

Problem polega na tym, że pola availability.* są definiowane jako keyword.

Muszą być typu date w kolejności range Zapytania o wartości data, aby zapewnić dokładne wyniki, w przeciwnym razie zapytania zasięgu po prostu wykonują porównanie leksykalne (tj. Ciąg) now vs daty Wartości wyrażone jako ciągi:

        availability: {
            properties: {
                end: {
                    type: "date"        <--- change this
                },
                start: {
                    type: "date"        <--- and this
                }
            }
        },

Nie możesz zmienić mapowania istniejących pól, ale zawsze możesz tworzyć nowe pola. Możesz więc zmienić mapowanie, aby utworzyć nowe pola {x0}} zarówno dla start, jak i end, podobnie:

PUT mydocs/_mapping
{
  "properties": {
    "availability": {
      "properties": {
        "end": {
          "type": "keyword",
          "fields": {
            "date": {
              "type": "date"
            }
          }
        },
        "start": {
          "type": "keyword",
          "fields": {
            "date": {
              "type": "date"
            }
          }
        }
      }
    }
  }
}

Następnie wystarczy uruchomić następujące polecenie, aby zaktualizować indeks:

POST mydocs/_update_by_query

A następnie zmodyfikuj zapytanie, aby korzystać z nowych pod-pola i to będzie działać:

POST mydocs/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "guid": "14744*"
          }
        },
        {
          "range": {
            "availability.start.date": {
              "lt": "now"
            }
          }
        },
        {
          "range": {
            "availability.end.date": {
              "gt": "now"
            }
          }
        }
      ]
    }
  }
}
1
Val 15 kwiecień 2021, 13:34