我在 ElasticSearch 中有一个索引,其映射如下:
mappings: {
feed: {
properties: {
html_url: {
index: not_analyzed
omit_norms: true
index_options: docs
type: string
}
title: {
index_options: offsets
type: string
}
created: {
store: true
format: yyyy-MM-dd HH:mm:ss
type: date
}
description: {
type: string
}
}
}
执行短语搜索("视频游戏"(时出现以下错误:
IllegalStateException[字段 \"title\" 在没有位置数据的情况下编制索引;无法运行 PhraseQuery (term=video(];
单个单词搜索工作正常。也尝试了"index_options:位置",但没有运气。标题字段包含多种语言的文本,有时为空。有趣的是,它似乎是随机失败的,例如,使用相同的数据集,它会在 200K 文档或 800K 文档时失败。是否有理由某些标题不会与位置索引?
弹性搜索版本 0.90.5
其他人遇到同样的问题。同一索引中还有另一种类型/表 (feed2(,具有设置为"not_analyzed"的相同"标题"字段。
出于某种原因,即使您指定了类型:http://elasticsearchhost.com:9200/index_name/feed/_search 其他类型仍在搜索中。更改 feed2 类型的映射解决了该问题。
您可能有另一个名为"title"的字段,该字段在另一种类型中具有不同的映射,但在同一索引中。
基本上,如果在同一索引中有 2 个同名字段 - 即使它们属于不同的类型 - 它们也不能有不同的映射:更准确地说,即使它们具有相同的类型(例如:"字符串"(,但其中一个被"分析",另一个被"未分析",就会出现问题。
我的意思是,是的,您可以尝试设置 2 种不同的映射,ElasticSearch 不会抱怨,但是在搜索时,您会得到奇怪的结果,一切都会变得困难。
您可以在此处阅读有关此问题的更多信息,他们说:
[...]最后,我们选择强制执行以下规则:同一索引中具有相同名称的所有字段必须具有相同的映射 [...]
是的,考虑到ElasticSearch的承诺一直是"它只是工作",这个小细节让很多人感到惊讶。