8

我在 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:positions”,但没有运气。标题字段包含多种语言的文本,有时为空。有趣的是它似乎随机失败,例如它会在 200K 文档或 800K 使用相同数据集时失败。是否有一些标题不会被位置索引的原因?

弹性搜索版本 0.90.5

4

2 回答 2

4

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

出于某种原因,即使您指定类型:http ://elasticsearchhost.com:9200/index_name/feed/_search其他类型仍在搜索中。更改 feed2 类型的映射解决了这个问题。

于 2013-11-20T16:44:11.983 回答
2

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

基本上,如果您在同一索引中有 2 个具有相同名称的字段 - 即使它们属于不同类型 - 它们也不能有不同的映射:更准确地说,即使它们具有相同的类型(例如:“字符串”)但是一个一个是“已分析”,一个是“未分析”,就会出现问题。

我的意思是,是的,您可以尝试设置 2 个不同的映射,并且 ElasticSearch 不会抱怨,但是在搜索时您会得到奇怪的结果,一切都会变得很糟糕。

您可以在此处阅读有关此问题的更多信息,他们说:

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

是的,考虑到 ElasticSearch 的承诺一直是“它只是有效”,这个细节让很多人感到惊讶。

于 2015-10-09T10:29:54.610 回答