Home Articles

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

Asked
Viewed 251 times
7

我在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”,但没有运气 . Headers 字段包含多种语言的文本,有时为空 . 有趣的是,它似乎随机失败,例如,它将使用相同的数据集失败200K文档或800K . 是否有一些理由不会将某些头衔编入索引?

弹性搜索版本0.90.5

2 Answers

  • 4

    以防其他人有同样的问题 . 在同一索引中有另一个类型/表(feed2),其中“title”字段设置为“not_analyzed” .

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

  • 2

    您可能有另一个名为'title'的字段,在同一索引中具有另一种类型 but 的不同映射 .

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

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

    你可以在这里找到更多关于这个问题的信息here

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

    是的,考虑到ElasticSearch的承诺一直是如此,这个小细节让很多人感到意外 .

Related