弹性搜索:在没有位置数据的情况下对字段"title"进行索引;无法运行短语查询



我在 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的承诺一直是"它只是工作",这个细节让很多人感到惊讶。

最新更新