Exist не находит документы с nested полем

Мой маппинг:

{
"city": {
"mappings": {
"nms": {
"properties": {
"post": {
"type": "long"
},
"area": {
"type": "long"
},
"segm": {
"type": "text"
}
}

Этот запрос не находит ни один документ:

GET products_v19/_search/
{
"query": {
"exists" : { "field" : "segm" }
}
}

Почему?

И как совмещать вместе любой запрос с этим? Как раньше, когда был "filter"

Я написала вымышленный маппинг, и искомое поле nested. Это может быть проблемой?

Спасибо.

Вы не могли бы показать полный пример с созданием индекса, добавлением записи и поиском, который я мог бы просто скопировать, запустить и сразу увидеть в чем проблема?

Создаю индекс:

PUT twit
{
  "mappings": {
    "tweet": {
      "properties": {
        "message": {
          "type": "nested"
        },
        "date":{
            "type":"text"
        }
      }
    }
  }
}

Документ:

 POST twit/1
{
    "tweet":{
        "message":{
            "op":"ewr",
            "ds":"ds"
        },
        "date":"ccv"
    }
}
POST twit/2
{
    "tweet":{
        "message":{
          "fdgd":"dgs",
            "ds":"ds"
        },
        "date":"ccv"
    }
}

Ответ:

{
   "_index": "twit",
   "_type": "1",
   "_id": "AVtC3Rt_iqMx7bItF5QU",
   "_version": 1,
   "result": "created",
   "_shards": {
      "total": 2,
      "successful": 2,
      "failed": 0
   },
   "created": true
}
GET twit/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "exists": {
          "field": "op"
        }
      },
      "boost": 1.2
    }
  }
}

Ответ:

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

Здесь я еще попробовала разные type, а в оригинале все документы лежат в одном.

Тут несколько проблем.

  • POST twit/1 создает документ с типом 1 и сгенерированным id
  • "tweet":{... } на верхнем уровне не нужен, либо вам его надо добавить в меппинг.
  • для поиска nested объектов надо использовать специальный запрос nested
  • в 5.x constant_score

Со всеми этими

PUT twit
{
  "mappings": {
    "tweet": {
      "properties": {
        "message": {
          "type": "nested"
        },
        "date":{
            "type":"text"
        }
      }
    }
  }
}

PUT twit/tweet/1
{
  "message": {
    "op":"ewr",
    "ds":"ds"
  },
  "date":"ccv"
}

PUT twit/tweet/2
{
  "message":{
    "fdgd":"dgs",
    "ds":"ds"
  },
  "date":"ccv"
}

GET twit/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "nested": {
          "path": "message",
          "query": {
            "exists": {
              "field": "message.op"
            }
          }
        }
      },
      "boost": 1.2
    }
  }
}

Если у вас только один message на tweet, то он должен быть не nested а object и тогда пример будет выглядить так

PUT twit
{
  "mappings": {
    "tweet": {
      "properties": {
        "message": {
          "type": "object"
        },
        "date":{
            "type":"text"
        }
      }
    }
  }
}

PUT twit/tweet/1
{
  "message": {
    "op":"ewr",
    "ds":"ds"
  },
  "date":"ccv"
}

PUT twit/tweet/2
{
  "message":{
    "fdgd":"dgs",
    "ds":"ds"
  },
  "date":"ccv"
}

GET twit/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "exists": {
          "field": "message.op"
        }
      },
      "boost": 1.2
    }
  }
}

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.