(27)ElasticSearch 复合查询

  在实际应用当中,有时候搜索条件复杂,我们可以使用复合查询,也叫组合查询。可以使用bool查询。  

  1、使用bool查询

  接收以下参数:

  must:文档必须匹配这些条件才能被包含进来。

  must_not:文档必须不匹配这些条件才能被包含进来。

  should:如果满足这些语句中的任意语句,将增加_score,否则无任何影响。它们主要用于修正每个文档的相关性得分。

  filter:必须匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

  相关性得分是如何组合的。每一个子查询都独自地计算文档的相关性得分。一旦他们的得分被计算出来,bool查询就将这些得分进行合并并且返回一个代表整个布尔操作的得分。

  2、准备数据

PUT /lib
{
    "settings":{
        "number_of_shards":3,
        "number_of_replicas":0
      },
        "mappings":{
            "user":{
                "properties":{
                    "name":{"type":"text"},
                    "address":{"type":"text"},
                    "age":{"type":"integer"},
                    "interests":{"type":"text"},
                    "birthday":{"type":"date"}
                }
            }
        }
}
put /lib/user/1
{
    "name":"zhaoliu",
    "address":"hei long jiang sheng tie ling shi",
    "age":50,
    "birthday":"1970-12-12",
    "interests":"xi huang hejiu,duanlian,lvyou"
}

put /lib/user/2
{
    "name":"zhaoming",
    "address":"bei jing hai dian qu qing he zhen",
    "age":20,
    "birthday":"1998-10-12",
    "interests":"xi huan hejiu,duanlian,changge"
}

put /lib/user/3
{
    "name":"lisi",
    "address":"bei jing hai dian qu qing he zhen",
    "age":23,
    "birthday":"1998-10-12",
    "interests":"xi huan hejiu,duanlian,changge"
}

put /lib/user/4
{
    "name":"wangwu",
    "address":"bei jing hai dian qu qing he zhen",
    "age":26,
    "birthday":"1998-10-12",
    "interests":"xi huan biancheng,tingyinyue,lvyou"
}

put /lib/user/5
{
    "name":"zhangsan",
    "address":"bei jing chao yang qu",
    "age":29,
    "birthday":"1988-10-12",
    "interests":"xi huan tingyinyue,changge,tiaowu"
}

  3、操作演示

  1)兴趣必须包含changge不能包含lvyou 或者 地址包含bei jing并且生日大于1996-01-01的

GET lib/user/_search
{
  "query":{
    "bool": {
      "must":{"match":{"interests":"changge"}},
      "must_not":{"match":{"interests":"ivyou"}},
      "should": [
        {"match": {"address": "bei jing"}},
        {"range": {"birthday": {"gte":"1996-01-01" }}}
      ]
    }
  }
}

  查询结果

{
  "took": 141,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 3.0426373,
    "hits": [
      {
        "_index": "lib",
        "_type": "user",
        "_id": "3",
        "_score": 3.0426373,
        "_source": {
          "name": "lisi",
          "address": "bei jing hai dian qu qing he zhen",
          "age": 23,
          "birthday": "1998-10-12",
          "interests": "xi huan hejiu,duanlian,changge"
        }
      },
      {
        "_index": "lib",
        "_type": "user",
        "_id": "2",
        "_score": 1.7223206,
        "_source": {
          "name": "zhaoming",
          "address": "bei jing hai dian qu qing he zhen",
          "age": 20,
          "birthday": "1998-10-12",
          "interests": "xi huan hejiu,duanlian,changge"
        }
      },
      {
        "_index": "lib",
        "_type": "user",
        "_id": "5",
        "_score": 0.77241296,
        "_source": {
          "name": "zhangsan",
          "address": "bei jing chao yang qu",
          "age": 29,
          "birthday": "1988-10-12",
          "interests": "xi huan tingyinyue,changge,tiaowu"
        }
      }
    ]
  }
}

  2)兴趣必须包含changge不能包含lvyou 或者 地址包含bei jing,并且生日大于1996-01-01的,即所有的生日大于1996-01-01

GET lib/user/_search
{
  "query":{
    "bool": {
      "must":{"match":{"interests":"changge"}},
      "must_not":{"match":{"interests":"ivyou"}},
      "should": [
        {"match": {"address": "bei jing"}}
      ],
      "filter": {
         "range": {"birthday": {"gte":"1996-01-01" }}
      }
    }
  }
}

  查询结果

{
  "took": 11,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 2.0426373,
    "hits": [
      {
        "_index": "lib",
        "_type": "user",
        "_id": "3",
        "_score": 2.0426373,
        "_source": {
          "name": "lisi",
          "address": "bei jing hai dian qu qing he zhen",
          "age": 23,
          "birthday": "1998-10-12",
          "interests": "xi huan hejiu,duanlian,changge"
        }
      },
      {
        "_index": "lib",
        "_type": "user",
        "_id": "2",
        "_score": 0.7223206,
        "_source": {
          "name": "zhaoming",
          "address": "bei jing hai dian qu qing he zhen",
          "age": 20,
          "birthday": "1998-10-12",
          "interests": "xi huan hejiu,duanlian,changge"
        }
      }
    ]
  }
}

  3)自己领略含义,过滤中可以使用bool

GET lib/user/_search
{
  "query":{
    "bool": {
      "must":{"match":{"interests":"changge"}},
      "must_not":{"match":{"interests":"ivyou"}},
      "should": [
        {"match": {"address": "bei jing"}}
      ],
      "filter": {
        "bool": {
          "must":[
            {"range":{"birthday":{"gte":"1990-01-01"}}},
            {"range":{"age":{"lte":30}}}
            ],
          "must_not":[
            {"term":{"age":"29"}}
            ]
        }
      }
    }
  }
}

  查询结果

{
  "took": 7,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 2.0426373,
    "hits": [
      {
        "_index": "lib",
        "_type": "user",
        "_id": "3",
        "_score": 2.0426373,
        "_source": {
          "name": "lisi",
          "address": "bei jing hai dian qu qing he zhen",
          "age": 23,
          "birthday": "1998-10-12",
          "interests": "xi huan hejiu,duanlian,changge"
        }
      },
      {
        "_index": "lib",
        "_type": "user",
        "_id": "2",
        "_score": 0.7223206,
        "_source": {
          "name": "zhaoming",
          "address": "bei jing hai dian qu qing he zhen",
          "age": 20,
          "birthday": "1998-10-12",
          "interests": "xi huan hejiu,duanlian,changge"
        }
      }
    ]
  }
}

  4、constant_score查询

  它将一个不变的常量评分应用于所有匹配的文档。它被经常用于你只需要执行一个filter而没有其他查询(例如,评分查询)的情况下。

  例如:查询兴趣包含changge,但是不评分:

GET lib/user/_search
{
  "query": {
    "constant_score": {
      "filter": {"term": {
        "interests": "changge"
      }}
    }
  }
}

  查询结果

{
  "took": 8,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "lib",
        "_type": "user",
        "_id": "2",
        "_score": 1,
        "_source": {
          "name": "zhaoming",
          "address": "bei jing hai dian qu qing he zhen",
          "age": 20,
          "birthday": "1998-10-12",
          "interests": "xi huan hejiu,duanlian,changge"
        }
      },
      {
        "_index": "lib",
        "_type": "user",
        "_id": "5",
        "_score": 1,
        "_source": {
          "name": "zhangsan",
          "address": "bei jing chao yang qu",
          "age": 29,
          "birthday": "1988-10-12",
          "interests": "xi huan tingyinyue,changge,tiaowu"
        }
      },
      {
        "_index": "lib",
        "_type": "user",
        "_id": "3",
        "_score": 1,
        "_source": {
          "name": "lisi",
          "address": "bei jing hai dian qu qing he zhen",
          "age": 23,
          "birthday": "1998-10-12",
          "interests": "xi huan hejiu,duanlian,changge"
        }
      }
    ]
  }
}

  

  

  

猜你喜欢

转载自www.cnblogs.com/javasl/p/12559427.html