在ElasticSearch中搜索是否存在展平字段

mwecs4sa  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(1)|浏览(162)

我将一个任意的嵌套对象存储为一个扁平化字段“_meta”,其中包含了与产品相关的各种信息。

"mappings": {
        "dynamic": "strict",
        "properties": {
            "_meta": {
                "type": "flattened"
            },
            ...

因此在尝试搜索时:

{
    "query": {
        "exists": {
            "field": "_meta.user"
        }
    }
}

我希望检索填充了该字段的所有文档,但没有找到匹配项,尽管如果搜索特定文档,我可以看到至少有一个文档填充了该字段:

"user": {
  "origin_title": "some title",
  "origin_title_en": "some other title",
  "address": "some address",
  "performed_orders_count": 0,
  "phone": "some phone",
  "name": "some name",
  "tariff": null,
  "proposal_image_background_color": null
},

那么,在平面化的数据字段中搜索究竟是如何工作的呢?为什么我没有得到任何结果呢?

4urapxun

4urapxun1#

Tldr;

那是因为路flattened fields work的缘故。
在您的情况下:

{
    "_meta":{
        "user": {
            "name": "some name"
        }
    }
}

Elasticsearch可用的表示法有:

{
    "_meta": ["some name"],
    "_meta.user.name": "some name"
}

为了重现

对于设置:

PUT /74025685/
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "_meta":{
        "type": "flattened"
      }
    }
  }
}

POST /_bulk
{"index":{"_index":"74025685"}}
{"_meta":{"user": "some user"}}
{"index":{"_index":"74025685"}}
{"_meta":{"user": null, "age": 10}}
{"index":{"_index":"74025685"}}
{"_meta":{"user": ""}}
{"index":{"_index":"74025685"}}
{"_meta":{"user": {"username": "some user"}}}

此查询将查找2条记录:

GET 74025685/_search
{
  "query": {
    "term": {
      "_meta": {
        "value": "some user"
      }
    }
  }
}

这一条,只打算匹配第一个文档:

GET 74025685/_search
{
  "query": {
    "term": {
      "_meta.user": {
        "value": "some user"
      }
    }
  }
}

因此对于exist查询:
此方法将只返回最后一个文档。

GET 74025685/_search
{
  "query": {
    "exists": {
      "field": "_meta.user.username"
    }
  }
}

而这一个操作系统将返回第1个和第3个:

GET 74025685/_search
{
  "query": {
    "exists": {
      "field": "_meta.user"
    }
  }
}

相关问题