我在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 [field \“title \”已编入索引,没有位置数据;无法运行PhraseQuery(term = video)];
单字搜索工作正常。尝试了“index_options:position”,但没有运气。标题字段包含多种语言的文本,有时为空。有趣的是,它似乎随机失败,例如,它将使用相同的数据集失败200K文档或800K。是否有一些原因会使某些头衔无法被立场编入索引?
弹性搜索版本0.90.5
答案 0 :(得分:4)
以防其他人有同样的问题。在同一索引中有另一个类型/表(feed2)具有相同的"标题"设置为" not_analyzed"的字段。
由于某些原因,即使您指定了类型:http://elasticsearchhost.com:9200/index_name/feed/_search,其他类型仍在搜索中。更改feed2类型的映射修复了问题。
答案 1 :(得分:2)
你可能有另一个名为' title'在同一索引中使用另一种类型但的不同映射。
基本上,如果在同一索引中有2个具有相同名称的字段 - 即使它们属于不同类型 - 它们不能具有不同的映射:更准确,即使它们具有相同的类型(例如:"字符串")但其中一个是"分析"而另一个是"没有分析",会出现问题。
我的意思是,是的,你可以尝试设置2个不同的映射,ElasticSearch不会抱怨,但是在搜索时会得到奇怪的结果,一切都会变成香蕉。
您可以在其中详细了解此问题here:
[...]最后,我们选择强制执行以下规则:同一索引中具有相同名称的所有字段必须具有相同的映射[...]
是的,考虑到ElasticSearch的承诺一直是"它只是工作"这个小细节让很多人感到意外。