【发布时间】:2023-01-21 15:56:13
【问题描述】:
我有一个棘手的案例,想请教这里的专家。 我们将用户信息存储在 Elasticsearch 中,一个用户可能有不同的别名,所有这些都存储在如下所示的“名称”数组中
"names" : [
{
"userName" : "John Jerry",
"nameType" : "Primary Name"
},
{
"userName" : "John The Great",
"nameType" :"Also Known As"
},
{
"userName" : "Jerry Our Father",
"nameType" :"Also Known As"
}
]
当我们搜索用户名时,假设“琼斯很棒" 我们构建了一个如下所示的模糊搜索
{
"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”,因为此名称相对于输入“jone great”得分很高
问题是我怎么知道以编程方式模糊搜索选择数组中的哪个名称。想象一个用户有 100 个别名,有没有办法告诉 Elasticsearch 指出哪个别名是用户被选为匹配项的原因?
在我们目前的方法中,我们编写了一段代码来扫描 ES 返回的用户的所有别名,并选择可能的最佳别名。这很耗时,尤其是在用户有将近 100 个别名的情况下。
如果我们可以在 ES 查询中添加一些东西并使其突出显示它在数组中选择的名称,那将是最好的。
【问题讨论】:
标签: elasticsearch full-text-search fuzzy-search