【Elasticsearch教程3】查询文档 term terms terms_set

版本约定

本系列博客ES版本如下:

  • Elasticsearch 7.17.X
  • Spring Data Elasticsearch 4.4.X

Elasticsearch下载地址
Spring Data Elasticsearch 下载地址

term 查询

  • term查询判断某个字段是否包含一个确定的值。一般都是用在keyword、int,long、ip、date等类型上。
  • 避免用在text类型上,在text上应该用match匹配查询。

注意:term为是否包含的意思!

1 准备3条测试数据:

PUT /pigg_test/_doc/1
{ "name": "亚瑟王","age": 30,"sex": "男","tag":["战士", "坦克"] }

PUT /pigg_test/_doc/2
{ "name": "程咬金","age": 40,"sex": "男","tag":["战士", "打野"] }

PUT /pigg_test/_doc/3
{ "name": "安琪拉","age": 15,"sex": "女","tag":["法师"],"date": "2019-01-01","friend": "" }

2 不要text类型上用term查询

先在name字段上做term查询,发现查询不到文档

GET pigg_test/_search
{
  "query": {
    "term": {
      "name": "亚瑟王"
    }
  }
}

上面语句查询不到文档,是因为name默认是text类型,“亚瑟王”被拆成"亚"、“瑟”、“王”这3个汉字索引的,用Term vectors API查询下name字段来验证下。

GET /pigg_test/_termvectors/1?fields=name

返回如下:“亚瑟王”被拆成"亚"、“瑟”、“王”这3个汉字

"terms" : {
  "亚" : {
    "term_freq" : 1,
    "tokens" : [
      {
        "position" : 0,
        "start_offset" : 0,
        "end_offset" : 1
      }
    ]
  },
  "王" : {
    "term_freq" : 1,
    "tokens" : [
      {
        "position" : 2,
        "start_offset" : 2,
        "end_offset" : 3
      }
    ]
  },
  "瑟" : {
    "term_freq" : 1,
    "tokens" : [
      {
        "position" : 1,
        "start_offset" : 1,
        "end_offset" : 2
      }
    ]
  }
}

keyword类型上进行term查询

GET pigg_test/_search
{
  "query": {
    "term": {
      "name.keyword": "亚瑟王"
    }
  }
}

long类型上进行term查询

GET pigg_test/_search
{
  "query": {
    "term": {
      "age": 30
    }
  }
}

date类型上进行term查询

GET pigg_test/_search
{
  "query": {
    "term": {
      "date": "2019-01-01"
    }
  }
}

3 验证term是包含的意思

GET pigg_test/_search
{
  "query": {
    "term": {
      "tag.keyword": "战士"
    }
  }
}

上面查询语句返回了“亚瑟王”和“程咬金”这2个文档,因为他们的tag数组都包含了“战士”。

terms 查询

  • terms查询和term查询类似,它判断某个字段是否包含某一个或多个确定的值(value)。
  • terms查询的value是一个数组,里面包含多个你想要查询的值,只要有一个值命中就算符合。

查询tag.keyword包含"战士"或"坦克",返回“亚瑟王”和“程咬金”这2个文档。
用SQL描述类似 tag in (“战士”, “坦克”)

GET pigg_test/_search
{
  "query": {
    "terms": {
      "tag.keyword": ["战士", "坦克"]
    }
  }
}

terms_set 查询

  • terms_set查询和terms类似,但它定义了一个最小命中数。比如value数组里有3个值,最小命中数定义为2,说明字段里的值至少命中数组里的2个,才算这个文档符合。

下面语句设置最小匹配数为2,所以只返回“亚瑟王”这1个文档。

GET pigg_test/_search
{
    "query":{
        "terms_set":{
            "tag.keyword":{
                "terms":["战士","坦克"],
                "minimum_should_match_script":{
                    "source":"2"
                }
            }
        }
    }
}

你可能感兴趣的:(Elasticsearch,elasticsearch,搜索引擎,term,terms,terms_set)