如何使用Elasticsearch在一个合并请求中搜索范围和匹配查询?

时间:2016-10-16 16:35:46

标签: elasticsearch

我有两个按预期工作的汇编查询。

第一个使用常数得分,同时匹配两个值之间的范围:

GET /_search
{    
    "query" : {        
        "constant_score" : {
            "filter" : {
                "range" : {
                    "locationId" : {
                        "gte" : 100012138,
                        "lt"  : 101000349
                    }
                }                
            }            
        }        
    }    
}

第二个搜索bool。

GET /_search
{        
      "query": {         
        "filtered": {
            "query": {
                "bool": {
                    "must": [{
                        "match": {
                            "name": "Barcelona"                         
                        }                        
                    }]
                }
            }
        }
      }

}

现在我需要合并它们,我正在努力如何,因为尝试了许多组合放入不同的范围,但没有成功。

因此该查询返回错误。

GET /_search
{        
      "query": {         
        "filtered": {
            "query": {
                "bool": {
                    "must": [{
                        "match": {
                            "name": "sídlisko"                         
                        }                        
                    }]
                }
            }
        },
        "constant_score" : {
            "filter" : {
                "range" : {
                    "locationId" : {
                        "gte" : 100012138,
                        "lt"  : 1000010349
                    }
                }                
            }            
        }                  
    }                     
}

错误:

  

...无法解析搜索源。预期的字段名称但得到了   [START_OBJECT]

2 个答案:

答案 0 :(得分:1)

您可以将常量分数查询放在bool must子句

{
  "query": {
    "filtered": {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "name": "sidlisko"
              }
            },
            {
              "constant_score": {
                "filter": {
                  "range": {
                    "locationId": {
                      "gte": 100012138,
                      "lt": 1000010349
                    }
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}

答案 1 :(得分:1)

我已设法建立此查询,它似乎工作。 这看起来是最优化的。

GET /_search
{        
    "query": {         
        "filtered": {
            "query": {
                "bool": {
                    "must": [{
                        "match": {
                            "fullAddress": "sidlisko"                         
                        }                        
                    }]
                }
            },
            "filter" : {
                "range" : {
                    "locationId" : {
                        "gte": 100012138,
                        "lt": 1000010349
                    }
                }                
            } 
        }
    }                    
}