【问题标题】:Search by size of object type field elastic search按对象类型字段大小搜索弹性搜索
【发布时间】:2021-10-28 18:16:38
【问题描述】:

我有这样的映射:

{
  "post": {
    "properties": {
      "author_gender": {
        "type": "string",
        "index": "not_analyzed",
        "omit_norms": true,
        "index_options": "docs"
      },
      "author_link": {
        "type": "string",
        "index": "no"
      },
      "content": {
        "type": "string"
      },
      "mentions": {
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "profile_image_url": {
            "type": "string"
          },
          "screen_name": {
            "type": "string"
          }
        }
      }
   }
}

我需要按mentions 对象的大小进行搜索。我试过这个:

{
  "filter": {
    "script": {
      "script": "doc['mentions'].values.length == 2"
    }
  }
}

这不起作用。报错

嵌套:ElasticSearchIllegalArgumentException[未找到字段 [提及] 与类型 [post] 的映射];

我也尝试用doc['mentions.id'].value.length == 2 替换脚本部分。也是报错

嵌套:ArrayIndexOutOfBoundsException[10];

如何查询mentions对象大小为2的记录?

【问题讨论】:

标签: elasticsearch


【解决方案1】:

elasticsearch 指南建议对对象使用 size() 而不是 length。所以试试这个:

{
 "filter": {
   "script": {
     "script": "doc['mentions.id'].values.size() == 2"
    }
  }
}

一切顺利。

【讨论】:

  • 它仍然给出错误nested: ElasticSearchIllegalArgumentException[No field found for [mentions] in mapping with types [post]];...它说mentions不是帖子的字段..在搜索mentions字段存在的位置,我不得不像使用它一样这个"exists": {"field": "mentions.id"}。注意"mentions.id",而不是"mentions"
  • 是的,提到的是一个包含 id、name、prof_image_url 和 screen_name 的对象。因此,如果您想查找提及条目的数量(其中 1 组 id、name、prof_image_url 和 screen_name 构成一个条目),那么“mentions.id”将是要走的路。
  • @Sai ...正如我在问题中所说的那样,当我给出doc['mentions.id'].value.length == 2 时,我收到了这个错误nested: ArrayIndexOutOfBoundsException[10];。我创建了另一个字段 mention_count 并为现有字段更新了它们,现在将其用于查询。
  • 只是确认一下,您在上面的评论中提到您在使用 .value.length 时收到错误 ArrayIndexOutOfBoundsException[10]。使用 .value.size() 时是否出现同样的错误?我只是想确定一下,因为您的 cmets 似乎不够清晰。
  • 对不起@Sai..你是对的..当我做doc['mentions.id'].values.size() == 2时,我得到了正确的结果。非常感谢你的帮助!!你也可以发布你发现的链接elasticsearch guide recommends using size() instead of length for objects。我已经检查了指南,但无法在这里找到它 elasticsearch.org/guide/reference/mapping/object-type 。也许该链接对我将来的编码也有帮助。再次感谢!
【解决方案2】:

ElasticSearch 不会像您想象的那样存储对象数组。而是为每个对象属性存储多个数组。

这就是为什么你必须使用“子数组”来代替。

【讨论】:

    【解决方案3】:

    对我来说,它是这样工作的:

    ES 版本 - 7.11.1

    我有这样的映射:

    {
      "items": {
        "properties": {
          "description": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "quantity": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "value": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
    

    我的查询是这样的:

    {
      "filter": {
        "script": {
          "script": "doc['items.description.keyword'].size() == 2"
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2015-01-16
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多