CentOS系列之Elasticsearch(二):查询

Elasticsearch版本为6.3.0,其他版本可能不兼容,抱歉!

基本匹配查询

  • 这里有一个基本匹配查询,要在所有字段中查询字符串“李四”:
    URL:GET chzhao/person/_search?q=李四
    解释:q=条件
    结果:
{
  "took": 17,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.5753642,
    "hits": [
      {
        "_index": "chzhao",
        "_type": "person",
        "_id": "seu6bmQB9V3fvhOLwzKM",
        "_score": 0.5753642,
        "_source": {
          "name": "李四",
          "desc": "Python工程师"
        }
      }
    ]
  }
}
  • 模糊匹配
    URL:POST /chzhao/person/_search
    参数:
{
    "query": {
        "match" : {
            "desc" : "in Python"
        }
    },
    "size": 2,
    "from": 0,
    "_source": ["name","desc"],
    "highlight": {
        "fields" : {
            "name" : {}
        }
    }
}

结果:

{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "chzhao",
        "_type": "person",
        "_id": "seu6bmQB9V3fvhOLwzKM",
        "_score": 0.2876821,
        "_source": {
          "name": "李四",
          "desc": "Python工程师"
        }
      }
    ]
  }
}
  • 多字段查询
    URL:POST /chzhao/person/_search
    参数:
{
    "query": {
        "multi_match" : {
            "query":"Python",
            "fields":[
                    "name",
                    "desc"
                ]
        }
    }
}

结果:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "chzhao",
        "_type": "person",
        "_id": "seu6bmQB9V3fvhOLwzKM",
        "_score": 0.2876821,
        "_source": {
          "name": "李四",
          "desc": "Python工程师"
        }
      }
    ]
  }
}
  • 提高分值
    URL:POST /chzhao/person/_search
    解释:既然我们正在进行跨多字段的查询,也许想要对某个特定字段提高一些分值。在下面的人为例子中,我们将desc字段的分值提高2倍。提高分值不仅仅意味着计算得分被增长因子成倍的增加了,实际上提高分值的价值更在于通过它进行规范化和一些内部的优化。关于提高分值如何工作可以近一步参考Elasticsearch指南
    参数:
{
    "query": {
        "multi_match" : {
            "query":"工程",
            "fields":[
                    "name",
                    "desc^2"
                ]
        }
    }
}

结果:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 0.5753642,
    "hits": [
      {
        "_index": "chzhao",
        "_type": "person",
        "_id": "seu6bmQB9V3fvhOLwzKM",
        "_score": 0.5753642,
        "_source": {
          "name": "李四",
          "desc": "Python工程师"
        }
      },
      {
        "_index": "chzhao",
        "_type": "person",
        "_id": "1",
        "_score": 0.5753642,
        "_source": {
          "name": "王五",
          "desc": "运维工程师"
        }
      },
      {
        "_index": "chzhao",
        "_type": "person",
        "_id": "CHE6g2QBJFDJAXuokGBo",
        "_score": 0.5753642,
        "_source": {
          "name": "赵六",
          "desc": "PHP工程师"
        }
      }
    ]
  }
}
  • 布尔查询

URL:POST /chzhao/person/_search
解释:为了获取更多相关且具体的结果,可以用AND/OR/NOT操作符来调整我们的搜索查询请求,在搜索API中则是用布尔查询来实施。布尔查询接收一个must参数(等价于AND)、一个must_not参数(等价于NOT)和一个should参数(等价于OR)。举个例子,比如我想查找一本书,书名里有“Elasticsearch”或“Solr”,且由“clinton gormley”所写,而非“radu gheorge”所写
参数:

{
    "query": {
        "bool": {
            "must": {
                "bool" : { 
                    "should": [ { "match": { "desc": "工程师" }}, { "match": { "name": "赵六" }} ] }
            },
            "must_not": { "match": {"name": "赵六" }}
        }
    }
}
  • 模糊查询
    URL:POST /chzhao/person/_search
    参数:
{
    "query": {
        "multi_match" : {
            "query" : "王",
            "fields": ["name", "desc"],
            "fuzziness": "AUTO"
        }
    }
}

结果:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "chzhao",
        "_type": "person",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "name": "王五",
          "desc": "运维工程师"
        }
      }
    ]
  }
}
  • 通配符查询
    解释:通配符查询允许你指定匹配的模式,而不是整个术语。? 匹配任何字符,*匹配零个或多个字符。
    URL:POST /chzhao/person/_search
    参数:
{
    "query": {
        "wildcard" : {
            "desc" : "*p*"
        }
    },
    "_source": ["name", "desc"],
    "highlight": {
        "fields" : {
            "name" : {}
        }
    }
}

结果:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "chzhao",
        "_type": "person",
        "_id": "seu6bmQB9V3fvhOLwzKM",
        "_score": 1,
        "_source": {
          "name": "李四",
          "desc": "Python工程师"
        }
      }
    ]
  }
}
  • 正则表达式查询
    URL:POST /chzhao/person/_search
    解释:ElasticSearch还支持正则表达式查询,此方式提供了比通配符查询更加复杂的模式。
    参数:
{
    "query": {
        "regexp" : {
            "desc" : "p[a-z]*n"
        }
    },
    "_source": ["name", "desc"],
    "highlight": {
        "fields" : {
            "name" : {}
        }
    }
}

结果:

{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "chzhao",
        "_type": "person",
        "_id": "seu6bmQB9V3fvhOLwzKM",
        "_score": 1,
        "_source": {
          "name": "李四",
          "desc": "Python工程师"
        }
      }
    ]
  }
}
  • 整句查询
    URL:POST /chzhao/person/_search
    解释:整句查询要求在请求字符串中的所有查询项必须都在文档中存在,文中顺序也得和请求字符串一致,且彼此相连。
    参数:
{
    "query": {
        "multi_match" : {
            "query": "Clint 最终对 Elasticsearch 的成功起到了重要作用。",
            "fields": ["name", "desc"]
        }
    },
    "_source": [ "name", "desc" ]
}

结果:

{
  "took": 8,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 8.647883,
    "hits": [
      {
        "_index": "chzhao",
        "_type": "person",
        "_id": "CXFtg2QBJFDJAXuorGC3",
        "_score": 8.647883,
        "_source": {
          "name": "Zach",
          "desc": "我仍然清晰地记得那个日子,我发布了这个开源项目第一个版本并在 IRC 聊天室创建一个频道,在那个最紧张的时刻,独自一人,急切地希望和盼望着第一个用户的到来。第一个跳进 IRC 频道的用户就是 Clint(克林顿),当时我好兴奋。好吧… 过了一会直到我发现 Clint 实际上是 Perl 用户啦,还是跟死亡讣告网站打交道。 我记得(当时)问自己为什么他不是来自于更“主流”的社区,像 Ruby 或 Python,亦或是一个稍微好点的使用案例。我真是大错特错!Clint 最终对 Elasticsearch 的成功起到了重要作用。他是第一个把 Elasticsearch 扔到生产环境中的人(还是 0.4 的版本!),初期与 Clint 的互动对于塑造 Elasticsearch 成今天的样子非常关键。对于什么是简单,Clint 有独特的见解并且他很少出错,这对 Elasticsearch 从管理、API 设计和日常使用等各个方面的易用性上面产生了很大的影响。 所以我们公司成立后不久,我们想也没想立即就联系 Clint 问他是否愿意加入我们。当我们成立公司时,我们做的第一件事就是提供公开培训。很难表达我们当时有多么紧张和担心是否真的有人会报名。但我们错了。培训到现在依然很成功,很多主要城市都还有大量的人等待参加。参加培训的人之中,有一个年轻的家伙吸引了我们注意,他的名字叫 Zach。 我们知道他有很多关于 Elasticsearch 的博客(并暗自嫉妒他用非常简单的方式来阐述复杂概念的能力),他还编写了一个 PHP 的客户端。 然后我们发现 Zach 他还是自掏腰包来参加我们的培训!你真的不能要求更多,于是我们找到 Zach,问他是否愿意加入我们的公司。Clint 和 Zach 是 Elasticsearch 能否成功的关键。他们是完美的解说家,从简单的上层应用到复杂的(Apache Lucene 的)底层逻辑。在 Elastic 这里我们非常珍惜这种独特技能。 Clint 还负责 Elasticsearch Perl 客户端,而 Zach 则负责 PHP,都是精彩的代码。最后,两位在 Elasticsearch 项目每天都在发生的大多数事情中也扮演着重要的角色。Elasticsearch 如此受欢迎的主要原因之一就是拥有与用户沟通产生共鸣的能力,Clint 和 Zach 都是这个集体的一份子,这让一切成为可能。"
        }
      }
    ]
  }
}
  • 请求字符串
    URL:POST /chzhao/person/_search
    解释:请求字符串类型(query_string)的查询提供了一个方法,用简洁的简写语法来执行多匹配查询、布尔查询、提权查询、模糊查询、通配符查询、正则查询和范围查询。
    参数:
{    
    "query": {
        "query_string" : {
            "query": "(我发布了这个开源项目~1 Python~1) AND (Zach)  OR (张三)",
            "fields": ["_all", "desc^2"]
        }
    },
    "_source": [ "name", "desc" ]
}

结果:

{
  "took": 20,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 3.1330857,
    "hits": [
      {
        "_index": "chzhao",
        "_type": "person",
        "_id": "CXFtg2QBJFDJAXuorGC3",
        "_score": 3.1330857,
        "_source": {
          "name": "Zach",
          "desc": "我仍然清晰地记得那个日子,我发布了这个开源项目第一个版本并在 IRC 聊天室创建一个频道,在那个最紧张的时刻,独自一人,急切地希望和盼望着第一个用户的到来。第一个跳进 IRC 频道的用户就是 Clint(克林顿),当时我好兴奋。好吧… 过了一会直到我发现 Clint 实际上是 Perl 用户啦,还是跟死亡讣告网站打交道。 我记得(当时)问自己为什么他不是来自于更“主流”的社区,像 Ruby 或 Python,亦或是一个稍微好点的使用案例。我真是大错特错!Clint 最终对 Elasticsearch 的成功起到了重要作用。他是第一个把 Elasticsearch 扔到生产环境中的人(还是 0.4 的版本!),初期与 Clint 的互动对于塑造 Elasticsearch 成今天的样子非常关键。对于什么是简单,Clint 有独特的见解并且他很少出错,这对 Elasticsearch 从管理、API 设计和日常使用等各个方面的易用性上面产生了很大的影响。 所以我们公司成立后不久,我们想也没想立即就联系 Clint 问他是否愿意加入我们。当我们成立公司时,我们做的第一件事就是提供公开培训。很难表达我们当时有多么紧张和担心是否真的有人会报名。但我们错了。培训到现在依然很成功,很多主要城市都还有大量的人等待参加。参加培训的人之中,有一个年轻的家伙吸引了我们注意,他的名字叫 Zach。 我们知道他有很多关于 Elasticsearch 的博客(并暗自嫉妒他用非常简单的方式来阐述复杂概念的能力),他还编写了一个 PHP 的客户端。 然后我们发现 Zach 他还是自掏腰包来参加我们的培训!你真的不能要求更多,于是我们找到 Zach,问他是否愿意加入我们的公司。Clint 和 Zach 是 Elasticsearch 能否成功的关键。他们是完美的解说家,从简单的上层应用到复杂的(Apache Lucene 的)底层逻辑。在 Elastic 这里我们非常珍惜这种独特技能。 Clint 还负责 Elasticsearch Perl 客户端,而 Zach 则负责 PHP,都是精彩的代码。最后,两位在 Elasticsearch 项目每天都在发生的大多数事情中也扮演着重要的角色。Elasticsearch 如此受欢迎的主要原因之一就是拥有与用户沟通产生共鸣的能力,Clint 和 Zach 都是这个集体的一份子,这让一切成为可能。"
        },
        "highlight": {
          "desc": [
            "我记得(当时)问自己为什么他不是来自于更“主流”的社区,像 Ruby 或 <em>Python</em>,亦或是一个稍微好点的使用案例。我真是大错特错!",
            "参加培训的人之中,有一个年轻的家伙吸引了我们注意,他的名字叫 <em>Zach</em>。",
            "然后我们发现 <em>Zach</em> 他还是自掏腰包来参加我们的培训!你真的不能要求更多,于是我们找到 <em>Zach</em>,问他是否愿意加入我们的公司。",
            "Clint 还负责 Elasticsearch Perl 客户端,而 <em>Zach</em> 则负责 PHP,都是精彩的代码。",
            "Elasticsearch 如此受欢迎的主要原因之一就是拥有与用户沟通产生共鸣的能力,Clint 和 <em>Zach</em> 都是这个集体的一份子,这让一切成为可能。"
          ]
        }
      }
    ]
  }
}
  • 简单请求字符串
    URL:POST /chzhao/person/_search
    解释:简单请求字符串类型(simple_query_string)的查询是请求字符串类型(query_string)查询的一个版本,它更适合那种仅暴露给用户一个简单搜索框的场景,因为,它用+/|/-分别替换了AND/OR/NOT,并且自动丢弃了请求中无效的部分,不会在用户犯错时抛出异常。
    参数:
{    
    "query": {
        "query_string" : {
            "query": "(我发布了这个开源项目~1 Python~1) + (Zach)  | (张三)",
            "fields": ["_all", "desc^2"]
        }
    },
    "_source": [ "name", "desc" ],
    "highlight":{
        "fields":{
            "desc":{}
        }
    }
}

结果:

{
  "took": 17,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 3.1330857,
    "hits": [
      {
        "_index": "chzhao",
        "_type": "person",
        "_id": "CXFtg2QBJFDJAXuorGC3",
        "_score": 3.1330857,
        "_source": {
          "name": "Zach",
          "desc": "我仍然清晰地记得那个日子,我发布了这个开源项目第一个版本并在 IRC 聊天室创建一个频道,在那个最紧张的时刻,独自一人,急切地希望和盼望着第一个用户的到来。第一个跳进 IRC 频道的用户就是 Clint(克林顿),当时我好兴奋。好吧… 过了一会直到我发现 Clint 实际上是 Perl 用户啦,还是跟死亡讣告网站打交道。 我记得(当时)问自己为什么他不是来自于更“主流”的社区,像 Ruby 或 Python,亦或是一个稍微好点的使用案例。我真是大错特错!Clint 最终对 Elasticsearch 的成功起到了重要作用。他是第一个把 Elasticsearch 扔到生产环境中的人(还是 0.4 的版本!),初期与 Clint 的互动对于塑造 Elasticsearch 成今天的样子非常关键。对于什么是简单,Clint 有独特的见解并且他很少出错,这对 Elasticsearch 从管理、API 设计和日常使用等各个方面的易用性上面产生了很大的影响。 所以我们公司成立后不久,我们想也没想立即就联系 Clint 问他是否愿意加入我们。当我们成立公司时,我们做的第一件事就是提供公开培训。很难表达我们当时有多么紧张和担心是否真的有人会报名。但我们错了。培训到现在依然很成功,很多主要城市都还有大量的人等待参加。参加培训的人之中,有一个年轻的家伙吸引了我们注意,他的名字叫 Zach。 我们知道他有很多关于 Elasticsearch 的博客(并暗自嫉妒他用非常简单的方式来阐述复杂概念的能力),他还编写了一个 PHP 的客户端。 然后我们发现 Zach 他还是自掏腰包来参加我们的培训!你真的不能要求更多,于是我们找到 Zach,问他是否愿意加入我们的公司。Clint 和 Zach 是 Elasticsearch 能否成功的关键。他们是完美的解说家,从简单的上层应用到复杂的(Apache Lucene 的)底层逻辑。在 Elastic 这里我们非常珍惜这种独特技能。 Clint 还负责 Elasticsearch Perl 客户端,而 Zach 则负责 PHP,都是精彩的代码。最后,两位在 Elasticsearch 项目每天都在发生的大多数事情中也扮演着重要的角色。Elasticsearch 如此受欢迎的主要原因之一就是拥有与用户沟通产生共鸣的能力,Clint 和 Zach 都是这个集体的一份子,这让一切成为可能。"
        },
        "highlight": {
          "desc": [
            "我记得(当时)问自己为什么他不是来自于更“主流”的社区,像 Ruby 或 <em>Python</em>,亦或是一个稍微好点的使用案例。我真是大错特错!",
            "参加培训的人之中,有一个年轻的家伙吸引了我们注意,他的名字叫 <em>Zach</em>。",
            "然后我们发现 <em>Zach</em> 他还是自掏腰包来参加我们的培训!你真的不能要求更多,于是我们找到 <em>Zach</em>,问他是否愿意加入我们的公司。",
            "Clint 还负责 Elasticsearch Perl 客户端,而 <em>Zach</em> 则负责 PHP,都是精彩的代码。",
            "Elasticsearch 如此受欢迎的主要原因之一就是拥有与用户沟通产生共鸣的能力,Clint 和 <em>Zach</em> 都是这个集体的一份子,这让一切成为可能。"
          ]
        }
      },
      {
        "_index": "chzhao",
        "_type": "person",
        "_id": "seu6bmQB9V3fvhOLwzKM",
        "_score": 0.47947016,
        "_source": {
          "name": "李四",
          "desc": "Python工程师"
        },
        "highlight": {
          "desc": [
            "<em>Python</em>工程师"
          ]
        }
      }
    ]
  }
}
  • 词条/多词条查询
    URL:POST /chzhao/person/_search
    解释:有时我们对结构化查询更感兴趣,希望得到更准确的匹配并返回结果,词条查询和多词条查询可帮我们实现。
    参数:
{    
    "query": {
        "terms" : {
            "name": ["alvin", "jack"]
        }
    },
    "_source": [ "name", "age", "address" ],
    "highlight":{
        "fields":{
            "desc":{}
        }
    }
}

结果:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 1,
    "hits": [
      {
        "_index": "alvin",
        "_type": "person",
        "_id": "CnGng2QBJFDJAXuo_WD6",
        "_score": 1,
        "_source": {
          "address": "河南",
          "name": "Alvin",
          "age": 20
        }
      },
      {
        "_index": "alvin",
        "_type": "person",
        "_id": "DHGog2QBJFDJAXuo8mDD",
        "_score": 1,
        "_source": {
          "address": "上海",
          "name": "Jack",
          "age": 20
        }
      }
    ]
  }
}
  • 词条查询 - 排序
    URL:POST /alvin/person/_search
    解释:词条查询的结果(和其他查询结果一样)可以被轻易排序,多级排序也被允许。
    参数:
{    
    "query": {
        "terms" : {
            "address": ["河南"]
        }
    },
    "_source": [ "name", "age", "address" ],
    "sort":[
        {"age":{"order":"asc"}}
    ]
}

结果:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": null,
    "hits": [
      {
        "_index": "alvin",
        "_type": "person",
        "_id": "CnGng2QBJFDJAXuo_WD6",
        "_score": null,
        "_source": {
          "address": "河南",
          "name": "Alvin",
          "age": 20
        },
        "sort": [
          20
        ]
      },
      {
        "_index": "alvin",
        "_type": "person",
        "_id": "EHETh2QBJFDJAXuoTGAn",
        "_score": null,
        "_source": {
          "address": "河南",
          "name": "Lindar",
          "age": "22"
        },
        "sort": [
          22
        ]
      },
      {
        "_index": "alvin",
        "_type": "person",
        "_id": "DnESh2QBJFDJAXuo72Bo",
        "_score": null,
        "_source": {
          "address": "河南",
          "name": "Tom",
          "age": "22"
        },
        "sort": [
          22
        ]
      },
      {
        "_index": "alvin",
        "_type": "person",
        "_id": "D3ETh2QBJFDJAXuoJmBp",
        "_score": null,
        "_source": {
          "address": "河南",
          "name": "Lush",
          "age": "22"
        },
        "sort": [
          22
        ]
      }
    ]
  }
}
  • 范围查询
    URL:POST alvin/person/_search
    备注:范围查询作用于日期、数字和字符串类型的字段。
    参数:
{    
    "query": {
        "range" : {
            "age": {
                "gte": "19",
                "lte": "21"
            }
        }
    },
    "_source": [ "name", "age", "address" ],
    "sort":[
        {"age":{"order":"asc"}}
    ]
}

结果:

{
  "took": 8,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": null,
    "hits": [
      {
        "_index": "alvin",
        "_type": "person",
        "_id": "CnGng2QBJFDJAXuo_WD6",
        "_score": null,
        "_source": {
          "address": "河南",
          "name": "Alvin",
          "age": 20
        },
        "sort": [
          20
        ]
      },
      {
        "_index": "alvin",
        "_type": "person",
        "_id": "DHGog2QBJFDJAXuo8mDD",
        "_score": null,
        "_source": {
          "address": "上海",
          "name": "Jack",
          "age": 20
        },
        "sort": [
          20
        ]
      },
      {
        "_index": "alvin",
        "_type": "person",
        "_id": "DXGpg2QBJFDJAXuoHWBk",
        "_score": null,
        "_source": {
          "address": "北京",
          "name": "Mosson",
          "age": 20
        },
        "sort": [
          20
        ]
      }
    ]
  }
}
  • 过滤查询
    URL:POST /alvin/person/_search
    参数:
{    
    "query": {
        "bool": {
            "must" : {
                "multi_match": {
                    "query": "上海",
                    "fields": ["name","address"] }
            },
            "filter": {
                "range" : {
                    "age": { "gte": 20 } }
            }
        }
    },
    "_source": [ "name", "age", "address" ]
}

结果:

{
  "took": 9,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.6931472,
    "hits": [
      {
        "_index": "alvin",
        "_type": "person",
        "_id": "DHGog2QBJFDJAXuo8mDD",
        "_score": 0.6931472,
        "_source": {
          "address": "上海",
          "name": "Jack",
          "age": 20
        }
      }
    ]
  }
}
  • 多重过滤
    URL:POST /alvin/person/_search
    参数:
{    
    "query": {
        "bool": {
            "must" : {
                "multi_match": {
                    "query": "alvin",
                    "fields": ["name","address"] }
            },
            "filter": {
                "bool":{
                    "must":{ "range":{ "age":{ "gte":19 } } },
                    "should":{ "term":{ "name": "alvin" } } }
            }
        }
    },
    "_source": [ "name", "age", "address" ]
}

结果:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.6931472,
    "hits": [
      {
        "_index": "alvin",
        "_type": "person",
        "_id": "CnGng2QBJFDJAXuo_WD6",
        "_score": 0.6931472,
        "_source": {
          "address": "河南",
          "name": "Alvin",
          "age": 20
        }
      }
    ]
  }
}

猜你喜欢

转载自blog.csdn.net/qq_33261700/article/details/80986996