Elasticsearch:字段“title”被索引而没有位置数据;无法运行PhraseQuery

时间:2013-10-10 17:58:43

标签: elasticsearch

我在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

2 个答案:

答案 0 :(得分:4)

以防其他人有同样的问题。在同一索引中有另一个类型/表(feed2)具有相同的"标题"设置为" not_analyzed"的字段。

由于某些原因,即使您指定了类型:http://elasticsearchhost.com:9200/index_name/feed/_search,其他类型仍在搜索中。更改feed2类型的映射修复了问题。

答案 1 :(得分:2)

你可能有另一个名为' title'在同一索引中使用另一种类型的不同映射。

基本上,如果在同一索引中有2个具有相同名称的字段 - 即使它们属于不同类型 - 它们不能具有不同的映射:更准确,即使它们具有相同的类型(例如:"字符串")但其中一个是"分析"而另一个是"没有分析",会出现问题。

我的意思是,是的,你可以尝试设置2个不同的映射,ElasticSearch不会抱怨,但是在搜索时会得到奇怪的结果,一切都会变成香蕉。

您可以在其中详细了解此问题here

  

[...]最后,我们选择强制执行以下规则:同一索引中具有相同名称的所有字段必须具有相同的映射[...]

是的,考虑到ElasticSearch的承诺一直是"它只是工作"这个细节让很多人感到意外。