我有一个棘手的案例,想咨询一下这里的Maven。我们在Elasticsearch中存储用户信息,一个用户可能有不同的别名,所有这些都存储在一个“names”数组中,如下所示
"names" : [
{
"userName" : "John Jerry",
"nameType" : "Primary Name"
},
{
"userName" : "John The Great",
"nameType" :"Also Known As"
},
{
"userName" : "Jerry Our Father",
"nameType" :"Also Known As"
}
]
当我们搜索一个用户名时,假设“jone great”,我们构建一个如下所示的模糊搜索
{
"span_near": {
"clauses": [
{
"span_multi": {
"match": {
"fuzzy": {
"names.userName": {
"value": "jone",
"fuzziness": "1",
"prefix_length": 0,
"max_expansions": 50,
"transpositions": true,
"boost": 1
}
}
},
"boost": 1
}
},
{
"span_multi": {
"match": {
"fuzzy": {
"names.userName": {
"value": "great",
"fuzziness": "1",
"prefix_length": 0,
"max_expansions": 50,
"transpositions": true,
"boost": 1
}
}
},
"boost": 1
}
}
],
"slop": 2,
"in_order": false,
"boost": 1
}
},
此查询将返回上面的用户,其别名为“John The Great”,因为此名称相对于输入“Jones great”具有良好的得分
问题是我如何知道编程模糊搜索选择了数组中的哪个名字。假设一个用户有100个名字别名,有没有办法告诉Elasticsearch指出哪个别名是用户被选择作为匹配的原因?
在我们目前的方法中,我们编写一段代码来扫描ES返回的所有用户别名,并选择最佳的别名。这是非常耗时的,特别是当用户有近100个别名时。
如果我们可以在ES查询中添加一些东西,并使其突出显示它在数组中选择的名称,那将是最好的。
1条答案
按热度按时间8ehkhllq1#
是的,只需使用相同的子句执行嵌套查询,并指定“inner_hits”:{“size”:1}。这将返回顶部匹配的嵌套数组元素。