弹性搜索如何查询多重匹配或函数

时间:2016-06-28 08:49:53

标签: elasticsearch

我将通过三个以下参数来运行查询,这些参数是;

  • 查询 - 地名,说明或空,
  • lat - 一个地方的纬度或空,
  • lon - 一个地方的经度或空的

根据以上参数,我会根据items分数查询query列表,然后计算resultlat, lon之间的距离。

现在,我有以下脚本来根据itemsquery获取distance;

{
    "query": {
        "function_score": {
            "query": {
                "bool": {
                    "must": [{
                        "multi_match" : {
                            "query": "Lippo", 
                            "fields": [ "name^6", "city^5", "country^4", "position^3", "address_line^2", "description"]
                        }
                    }]
                }
            },
            "functions": [
                {
                    "gauss": {
                        "position": {
                            "origin":  "-6.184652, 106.7518749",
                            "offset": "2km",
                            "scale": "10km",
                            "decay": 0.33
                        }
                    }
                }
            ]
        }
    }
}

但问题是,如果query为空,则根本没有结果。我想要的是,结果基于querydistance

反正有没有实现这个目标?任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:2)

将多重匹配的zero_terms_query选项设置为all可以让您在查询为空时获得结果。

示例:

{
    "query": {
        "function_score": {
            "query": {
                "bool": {
                    "must": [{
                        "multi_match" : {
                            "query": "Lippo", 
                            "fields": [ "name^6", "city^5", "country^4", "position^3", "address_line^2", "description"],
                          "zero_terms_query" : "all"
                        }
                    }]
                }
            },
            "functions": [
                {
                    "gauss": {
                        "position": {
                            "origin":  "-6.184652, 106.7518749",
                            "offset": "2km",
                            "scale": "10km",
                            "decay": 0.33
                        }
                    }
                }
            ]
        }
    }
}