语境
本质上,我拥有的是一个大型的姓名数据集,分为 pty_firstname 和 pty_surname。我将这些数据从 Informix DB 索引到 ElasticSearch,这一切都很好。但是,我未能实现的是此表结构的逻辑映射,以及从映射中受益的查询。我似乎遇到问题的地方是名称实际上分为两列,这对我来说,返回一个健全的结果集的查询有点棘手。
如果有人可以给我一些帮助,以便我返回一个在顶部具有最接近(如果不是完全匹配)的结果集,并且随着我们通过结果集的进展,结果变得越来越不相似。
映射
我试图在这里为我的映射和查询获得一些灵感,并进行了一些更改,但是我似乎无法获得我需要/想要的结果 - http://goo.gl/hm9ISL
{
"mappings":{
"user":{
"properties":{
"pty_forename":{
"type":"multi_field",
"fields":{
"name":{
"type":"string",
"index":"analyzed"
},
"exact":{
"type":"string",
"index":"not_analyzed"
}
}
},
"pty_surname":{
"type":"multi_field",
"fields":{
"name":{
"type":"string",
"index":"analyzed"
},
"exact":{
"type":"string",
"index":"not_analyzed"
}
}
},
"pty_minute_ref":{
"type":"integer",
"index":"not_analyzed"
},
"pty_deed_code":{
"type":"string",
"index":"not_analyzed"
},
"pty_name_prefix":{
"type":"string",
"index":"not_analyzed"
},
"pty_name_suffix":{
"type":"string",
"index":"not_analyzed"
},
"pty_address":{
"type":"string",
"index":"not_analyzed"
},
"pty_desig_suffix":{
"type":"string",
"index":"not_analyzed"
},
"pty_mc_ind":{
"type":"string",
"index":"not_analyzed"
},
"pty_of_ind":{
"type":"string",
"index":"not_analyzed"
},
"pty_or_ind":{
"type":"integer",
"index":"not_analyzed"
},
"pty_date_entered":{
"type":"basic_date",
"index":"not_analyzed"
},
"pty_data":{
"type":"string",
"index":"not_analyzed"
},
"pty_type":{
"type":"string",
"index":"not_analyzed"
}
}
}
}
}
询问
{
"query":{
"bool":{
"must":[
{
"multi_match":{
"query":"Nathan Smith",
"fields":[
"pty_forename",
"pty_surname"
]
}
}
],
"should":[
{
"term":{
"pty_forename.exact":{
"value":"Nathan Smith",
"boost":15
}
}
},
{
"prefix":{
"pty_forename.exact":{
"value":"Nathan Smith",
"boost":10
}
}
},
{
"match_phrase":{
"pty_forename":{
"query":"Nathan Smith",
"slop":0,
"boost":5
}
}
}
]
}
}
}
结论
我返回的结果集没有查询两个字段,即 pty_forename 和 pty_surname,而是返回姓氏为 Nathan 等的人。任何帮助将不胜感激。
更新 - 链接到 Gist