我正在寻求您的帮助,以建立一个解决方案如下:
这个查询是什么:查询检查是否存在关键字,以检查这五个字段(如街道、城市、姓氏、国家、大陆)中的任何一个,以便检查其中任何一个具有美国或英国的字段。
我所寻求的帮助。
得分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"
}
}]
}
}
}发布于 2018-08-05 14:10:10
解决这个问题有两种方法。
(注意:我将下面的查询简化为对单个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,结合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"
}
}
}
]
}
}
}https://stackoverflow.com/questions/51691917
复制相似问题