Как искать при условии, что это поле может существовать или не существовать в Elasticsearch - PullRequest
2 голосов
/ 26 мая 2020

Я выполняю поиск в elasticsearch с обязательным условием. Но есть поле флага, которое может присутствовать или отсутствовать в elasticsearch. Итак, как мне это закодировать? В приведенном ниже примере поле «c» не определено. Он присутствует, чем я должен искать с ним, иначе я могу игнорировать ...

   "query": {
            "bool": {
                "must": [
                    {
                        "match": {
                            "a": "norm"
                        }
                    },
                    {
                        "match_phrase": {
                            "b": "views"
                        }
                    },
                "must_not": {
                    "exists": {
                        "field": "c"
                    }
                 },
                    {
                        "match_phrase": {
                            "c": "claims"
                        }
                    }
                ]}
        }

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Использовать фильтр и существовать.

существует

фильтр

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must_not": [
            {
              "missing": {
                "field": "your_field"
              }
            }
          ]
        }
      }
    }
  }
}
0 голосов
/ 26 мая 2020

Запрос довольно понятен. Я добавил предложение should с совпадением в поле c и отсутствие проверки в поле c. Minimum_should_match установлено как 1. Возвращается документ, соответствующий любому из предложений, т.е. либо он не должен существовать, либо должен соответствовать входной строке

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "a": "norm"
          }
        },
        {
          "match_phrase": {
            "b": "views"
          }
        }
      ],
      "should": [
        {
          "match": {
            "c": "claims"
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "c"
                }
              }
            ]
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}

Данные:

 "hits" : [
      {
        "_source" : {
          "a" : "norm",
          "b" : "views",
          "c" : "claims"
        }
      },
      {
        "_source" : {
          "a" : "norm",
          "b" : "views"
        }
      },
      {
        "_source" : {
          "a" : "norm",
          "b" : "views",
          "c" : "ddd"
        }
      }
    ]

Результат:

"hits" : [
      {
        "_source" : {
          "a" : "norm",
          "b" : "views",
          "c" : "claims"
        }
      },
      {
        "_source" : {
          "a" : "norm",
          "b" : "views"
        }
      }
    ]

Возвращается документ, в котором c = "претензии" или c не существует

...