elasticsearch index_name with multi_field

时间:2014-04-28 18:06:29

标签: elasticsearch

我有2个单独的索引,每个索引包含不同的类型 我希望得到两者的组合记录。

问题是,一种类型具有字段' 电子邮件'另一种类型具有' work_email '。但是我想将它们视为排序目的相同的东西。 这就是为什么我尝试在其中一种类型中使用 index_name

以下是映射:

索引1:

  "mappings": {
     "people": {
        "properties": {
           "work_email": {
              "type": "string",
              "index_name": "email",
              "fields": {
                 "raw": {
                    "type": "string",
                    "index": "not_analyzed"
                 }
              }
           }
        }
     }
  }

索引2:

  "mappings": {
     "companies": {
        "properties": {
           "email": {
              "type": "string",
              "fields": {
                 "raw": {
                    "type": "string",
                    "index": "not_analyzed"
                 }
              }
           }
        }
     }
  }

我希望这可行:

GET /index1,index2/people,companies/_search?
{
  "sort": [
    {
      "email.raw": {
        "order": "asc"
      }
    }
  ]
}

但是,我得到一个错误,即“人”中没有这样的字段。类型。 我做错了什么,或者有更好的方法来实现我的需求吗?

您可以在此处找到说明问题的娱乐脚本:https://gist.github.com/pmishev/11375297

2 个答案:

答案 0 :(得分:0)

映射多字段的方式有问题。查看下面的映射并尝试索引..你应该得到结果

"mappings": {
 "people": {
    "properties": {
           "work_email":{
            "type": "multi_field", 
            "fields": {
                "work_email":{
                    "type": "string",
                    "index_name": "email"
                },
                "raw":{
                    "type": "string",
                    "index": "not_analyzed"
                }
            }
        }
        }
        }
        }

我们应该将类型指定为multi_field,并在字段下指定必填字段....

答案 1 :(得分:0)

我最终在我的映射中添加了'copy_to'属性:

 "mappings": {
 "people": {
    "properties": {
       "work_email": {
          "type": "string",
          "copy_to": "email",
          "fields": {
             "raw": {
                "type": "string",
                "index": "not_analyzed"
             }
          }
       }
    }
 }

}

所以现在我可以将这两个字段作为电子邮件来处理。 这并不理想,因为这意味着电子邮件字段实际上已被索引两次,但这是唯一可行的。