命名为“语言”的字段是否有些特殊?

时间:2018-06-25 16:14:23

标签: elasticsearch

在我的查询中,我具有以下过滤器:

"term": {
  "language": "en-us"
}

尽管有很多文档带有“ language” =“ en-us”并且此字段在映射中正确定义,但它没有返回任何结果。例如,当我更改过滤器时:

"term": {
  "isPublic": true
}

然后通过“ isPublic”字段正确过滤。

我在这里的怀疑是,以某种特殊方式对待了名为“语言”的字段?也许它是ES查询中的保留关键字?在文档中找不到它。

ES v2.4.0


映射文件:

"mappings": {
      "contributor": {
        "_timestamp": {},
        "properties": {
          "createdAt": {
            "type": "date",
            "format": "epoch_millis||dateOptionalTime"
          },
          "displayName": {
            "type": "string"
          },
          "followersCount_en_us": {
            "type": "long"
          },
          "followersCount_zh_cn": {
            "type": "long"
          },
          "id": {
            "type": "long"
          },
          "isPublic": {
            "type": "boolean"
          },
          "language": {
            "type": "string"
          },
          "photoUrl": {
            "type": "string",
            "index": "not_analyzed"
          },
          "role": {
            "type": "string",
            "store": true
          },
          "slug": {
            "type": "string",
            "index": "not_analyzed"
          }
        }
      }
    }
  }

1 个答案:

答案 0 :(得分:1)

字段language没什么特别的。它应该全部在映射中。我想到了几种可能的原因:

  1. 查询分析器!=索引分析器
  2. 分析器首先将其分为两个标记ende,然后丢弃短标记,这会使查询和索引均为空:-)
  3. 该字段没有索引,只是存储了。
  4. -不是索引或查询中的普通ASCII短划线。当人们粘贴来自文字处理器的查询时,我已经看到疯狂的事情发生,例如引号不再是直接引号,破折号不再是单引号或mdash,而是不是一个字符而是一个组合字符。

在映射后添加到问题中的编辑:

string类型也通过标准分析器进行分析,标准分析器也将文本也拆分为标记,特别是在短划线处,因此该字段包含两个标记“ en”和“ us”。您的搜索是一个term查询,应该将其称为令牌查询,因为它正是在您编写令牌时查询该令牌:“ en-us”。但是该令牌在该字段中不存在。

两种补救方法:

  1. 将字段设置为未分析,并保持查询不变
  2. 将查询更改为匹配查询。

我宁愿使用(1),因为语言字段的内容类似于ID,因此不应进行分析。

有关以下主题的更多信息:“为什么查询字词与我的文档不匹配?”在https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-term-query.html