在我的查询中,我具有以下过滤器:
"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"
}
}
}
}
}
答案 0 :(得分:1)
字段language
没什么特别的。它应该全部在映射中。我想到了几种可能的原因:
en
和de
,然后丢弃短标记,这会使查询和索引均为空:-)-
不是索引或查询中的普通ASCII短划线。当人们粘贴来自文字处理器的查询时,我已经看到疯狂的事情发生,例如引号不再是直接引号,破折号不再是单引号或mdash,而是不是一个字符而是一个组合字符。在映射后添加到问题中的编辑:
string
类型也通过标准分析器进行分析,标准分析器也将文本也拆分为标记,特别是在短划线处,因此该字段包含两个标记“ en”和“ us”。您的搜索是一个term
查询,应该将其称为令牌查询,因为它正是在您编写令牌时查询该令牌:“ en-us”。但是该令牌在该字段中不存在。
两种补救方法:
我宁愿使用(1),因为语言字段的内容类似于ID,因此不应进行分析。
有关以下主题的更多信息:“为什么查询字词与我的文档不匹配?”在https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-term-query.html
上