我正在寻找您的帮助,以解决以下问题:
此查询是什么: 查询以检查关键字是否存在五个字段中的任何一个(例如街道,城市,姓氏,国家/地区,大陆) 所以我想检查那些具有美国或英国的字段
我正在寻找帮助的东西。
获得分数2: 如果在这五个(“街道”,“城市”,“姓氏”,“国家”,“大陆”)字段中的任何一个中都找到了两个关键字“美国”,“英国”
获得分数1: 如果在以下五个字段(“街道”,“城市”,“姓氏”,“国家”,“大陆”)中的任何一个中找到“美国”,“英国”中的任何一个关键字
获得分数0: 如果在这五个(“街道”,“城市”,“姓氏”,“国家”,“大陆”)字段中的任何一个中都没有找到这些关键词“美国”,“英国”
这样我就可以在前端结果中显示0/2或1/2或2/2
现有查询:
GET main_index/_doc/_search
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"fields": ["street","city","lastname","country","continent"],
"query": "united states",
"type": "phrase"
}
},
{
"multi_match": {
"fields": ["street","city","lastname","country","continent"],
"query": "united kingdom",
"type": "phrase"
}
}]
}
}
}
答案 0 :(得分:1)
有两种解决方法。
(注意:我简化了以下查询,以在单个address
字段上进行查询,但是原理保持不变)
1。命名查询+应用程序逻辑
如评论中的Val所示,您可以使用命名查询(例如,将其命名为us-query
和uk-query
)来知道哪个项目与哪个查询匹配。
然后,您可以让您的应用程序代码解析每个结果的matched_queries
字段,以了解匹配的查询并分配相关分数,然后再将结果返回到前端:
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"fields": ["address"],
"query": "united states",
"type": "phrase",
"_name": "us-query"
}
},
{
"multi_match": {
"fields": ["address"],
"query": "united kingdom",
"type": "phrase",
"_name": "uk-query"
}
}]
}
}
}
2。功能得分
您可以将script_score
类型的function score与filter
参数一起使用,为每个查询分配正确的分数。
我个人不喜欢这种解决方案,因为它使用过于复杂的查询来获得相当简单的结果,并在查询中引入了一些重复。
{
"query": {
"function_score": {
"query": { "match_all": {} },
"functions": [
{
"filter": {
"multi_match": {
"fields": ["address"],
"query": "united states",
"type": "phrase",
}
},
"script_score" : {
"script" : {
"source": "1"
}
}
},
{
"filter": {
"multi_match": {
"fields": ["address"],
"query": "united kingdom",
"type": "phrase",
}
},
"script_score" : {
"script" : {
"source": "1"
}
}
},
{
"filter": {
"bool": {
"must": [
{
"multi_match": {
"fields": ["address"],
"query": "united kingdom",
"type": "phrase",
}
},
{
"multi_match": {
"fields": ["address"],
"query": "united states",
"type": "phrase",
}
}
]
}
},
"script_score" : {
"script" : {
"source": "2"
}
}
}
]
}
}
}