我正在构建一个应用程序,用户可以在其中输入他们的技能,公司可以搜索(使用 ElasticSearch)具有特定技能的用户。
我创建一个这样的索引:
client.indices.create({
index: "candidates",
body: {
mappings: {
candidate: {
properties: {
languages: {type: 'text'},
skills: {type: 'text'},
},
},
},
},
}, (err, data) => {
if (err) console.log('err ', err);
if (data) console.log('data ', data);
})
}
在以下示例中,我想搜索具有“Facebook 广告”和“在线营销”技能的用户。
结果应该被排序,所以有两个匹配的用户应该在顶部。
{
"index": "candidates",
"type": "candidate",
"size": 10000,
"body": {
"query": {
"bool": {
"must": [
{
"bool": {
"should": {
"terms": {
"skills": [
"facebook ads",
"online marketing"
]
}
}
}
}
]
}
}
}
}
上述查询返回零个结果。
问题:正如这里所解释的,我应该避免使用term(或terms)作为text字段。
问题: 如何实现将字符串数组(其中一些包含空格)作为输入并返回有序命中列表的搜索查询?通过有序点击我的意思是匹配查询中大部分技能的用户应该在顶部。
编辑
以下是同时具备 Facebook Ads 和 Google Ads 技能的用户的示例:
{
"_index" : "candidates",
"_type" : "candidate",
"_id" : "2fbbd818-sdhkfgkjhg-3235465hgfds",
"_score" : 9.1202545,
"_source" : {
"skills" : [
"Online strategi",
"Facebook Ads",
"Google Ads"
],
"languages": [
"da",
"en"
]
}
},
搜索 ['Facebook Ads', 'Google Ads'] 应该会在顶部返回上述用户(同时匹配 Facebook Ads 和 Google Ads),但也应该返回只有一个匹配项的用户。