ElasticSearch序列 - SpringBoot整合ES:范围查询 range

这篇具有很好参考价值的文章主要介绍了ElasticSearch序列 - SpringBoot整合ES:范围查询 range。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

01. ElasticSearch range查询是什么?

Elasticsearch 中的 range 查询可以用于查询某个字段在一定范围内的文档。

range 查询可同时提供包含和不包含这两种范围表达式,可供组合的选项如下:

  • gt: > 大于(greater than)
  • lt: < 小于(less than)
  • gte: >= 大于或等于(greater than or equal to)
  • lte: <= 小于或等于(less than or equal to)

02. ElasticSearch range 查询支持哪些数据类型?

它支持数值、日期、字符串、IP地址、地理范围等类型的字段。

03. ElasticSearch range 查询数值型数据?

① 索引文档,构造数据:

PUT /my_index
{
  "mappings": {
    "properties": {
      "price":{
        "type": "integer"
      }
    }
  }
}

PUT /my_index/_doc/1
{
  "price":10
}

PUT /my_index/_doc/2
{
  "price":20
}

PUT /my_index/_doc/3
{
  "price":30
}

② 查询 price 字段的值在 10 到 20 之间的文档 :

GET /my_index/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}
{
  "took" : 9,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "price" : 10
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "price" : 20
        }
      }
    ]
  }
}

04. ElasticSearch 字符串类型和文本类型的区别?

在Elasticsearch中,字符串类型和文本类型是两种不同的数据类型,它们在索引和搜索时有一些区别。

字符串类型是未经分词的字符串,它们被视为单个词项,并且可以用于精确匹配和范围查询。字符串类型的字段可以映射为keyword类型或text类型。如果将字段映射为keyword类型,则该字段将被视为未经分词的字符串,可以用于精确匹配和范围查询。如果将字段映射为text类型,则该字段将被视为经过分词器处理的文本,可以用于全文搜索和短语匹配。

文本类型是经过分词器处理的文本,它们被拆分成多个词项,并且可以用于全文搜索和短语匹配。文本类型的字段只能映射为text类型。

以下是一些字符串类型和文本类型的区别:

字符串类型可以用于精确匹配和范围查询,而文本类型可以用于全文搜索和短语匹配。
字符串类型的字段可以映射为keyword类型或text类型,而文本类型的字段只能映射为text类型。
字符串类型的字段被视为单个词项,而文本类型的字段被拆分成多个词项。
字符串类型的字段不会被分词器处理,而文本类型的字段会被分词器处理。

总之,字符串类型和文本类型是两种不同的数据类型,它们在索引和搜索时有一些区别。您需要根据具体的需求选择适合的数据类型。

05. ElasticSearch range 查询字符串类型的数据?

在Elasticsearch中,您可以使用range查询来搜索字符串类型的数据,但是在索引时需要注意一些细节。

默认情况下,Elasticsearch会将字符串类型的字段视为text类型,这意味着它们会被分词器处理,并且会被拆分成多个词项。因此,如果您想使用range查询来搜索字符串类型的数据,您需要将字段映射为keyword类型,以便将其视为未经分词的字符串。

① 索引文档,构造数据:

PUT /my_index
{
  "mappings": {
    "properties": {
      "tag":{
        "type": "keyword"
      }
    }
  }
}

PUT /my_index/_doc/1
{
  "tag":"A"
}

PUT /my_index/_doc/2
{
  "tag":"B"
}

PUT /my_index/_doc/3
{
  "tag":"C"
}

② 查询 tag 字段的值在A到C之间的文档:

GET /my_index/_search
{
  "query": {
    "range": {
      "tag": {
        "gte": "A",
        "lte": "C"
      }
    }
  }
}
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "tag" : "A"
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "tag" : "B"
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "tag" : "C"
        }
      }
    ]
  }
}

需要注意的是,使用range查询搜索字符串类型的数据时,查询结果是基于字典序的,而不是基于数值大小的。总之,您可以使用range查询来搜索字符串类型的数据,但是在索引时需要将字段映射为keyword类型,以便将其视为未经分词的字符串。

06. ElasticSearch range 无法查询文本类型的数据?

在Elasticsearch中,range查询不适用于文本类型的数据。range查询是基于数值或日期范围的查询,而不是基于文本范围的查询。如果您需要搜索文本类型的数据,可以使用其他类型的查询,例如match查询、prefix查询、wildcard查询、regexp查询等。

07. ElasticSearch range 查询日期类型的数据?

① 索引文档,构造数据:

PUT /my_index
{
  "mappings": {
    "properties": {
      "createTime":{
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      }
    }
  }
}

PUT /my_index/_doc/1
{
  "createTime":"2023-03-29 10:30:11"
}

PUT /my_index/_doc/2
{
   "createTime":"2023-03-29 10:35:11"
}

PUT /my_index/_doc/3
{
   "createTime":"2023-03-29 10:38:11"
}

② 查询 createTime 字段的值在日期 2023-03-29 10:35:11 到 2023-03-29 10:38:11 之间的文档:

GET /my_index/_search
{
  "query": {
    "range": {
      "createTime": {
        "gte": "2023-03-29 10:35:11",
        "lte": "2023-03-29 10:38:11"
      }
    }
  }
}
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "createTime" : "2023-03-29 10:35:11"
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "createTime" : "2023-03-29 10:38:11"
        }
      }
    ]
  }
}

08. ElasticSearch range 查询时间戳类型的数据?

① 索引文档,构造数据:

PUT /my_index
{
  "mappings": {
    "properties": {
      "createTime":{
        "type": "date",
        "format": "epoch_millis"
      }
    }
  }
}

PUT /my_index/_doc/1
{
  "createTime":1640995200000
}

PUT /my_index/_doc/2
{
   "createTime":1672531198000
}

PUT /my_index/_doc/3
{
   "createTime":1672531199000
}

② 查询 createTime 字段的值在时间戳 1640995200000 到 1672531199000之间的文档:

{
  "took" : 1038,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "createTime" : 1640995200000
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "createTime" : 1672531198000
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "createTime" : 1672531199000
        }
      }
    ]
  }
}

09. ElasticSearch range 查询数组类型数据?

range查询将会匹配包含任何一个数组元素在指定范围内的文档。如果您需要匹配所有数组元素都在指定范围内的文档,可以使用nested查询或parent-child关系来处理嵌套的数组类型数据。

① 索引文档,数据构造:

PUT /my_index
{
  "mappings": {
    "properties": {
      "price":{
        "type": "integer"
      }
    }
  }
}

PUT /my_index/_doc/1
{
  "price":[10]
}

PUT /my_index/_doc/2
{
  "price":[10,20]
}

PUT /my_index/_doc/3
{
  "price":[10,20,30]
}

② 查询 price 字段的值包含指定范围内(10-20)数值的文档,range查询将会匹配包含任何一个数组元素在指定范围内的文档。

{
  "took" : 15,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "price" : [
            10
          ]
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "price" : [
            10,
            20
          ]
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "price" : [
            10,
            20,
            30
          ]
        }
      }
    ]
  }
}

10. ElasticSearch range 查询对象类型的数据?

① 索引文档,数据构造:

PUT /my_index
{
  "mappings": {
    "properties": {
      "person": {
        "type": "object",
        "properties": {
          "name": {
            "type": "keyword"
          },
          "age": {
            "type": "integer"
          },
          "address": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

PUT /my_index/_doc/1
{
  "person": {
    "name": "John",
    "age": 30,
    "address": "123 Main St"
  }
}

PUT /my_index/_doc/2
{
  "person": {
    "name": "Alex",
    "age": 20,
    "address": "123 Main St"
  }
}

PUT /my_index/_doc/3
{
  "person": {
    "name": "Smith",
    "age": 10,
    "address": "123 Main St"
  }
}

② 查询 person.age 的值字段在10-20之间的文档:文章来源地址https://www.toymoban.com/news/detail-491184.html

GET /my_index/_search
{
  "query": {
    "range": {
      "person.age": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "person" : {
            "name" : "Alex",
            "age" : 20,
            "address" : "123 Main St"
          }
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "person" : {
            "name" : "Smith",
            "age" : 10,
            "address" : "123 Main St"
          }
        }
      }
    ]
  }
}

11. SpringBoot整合ES实现 range 查询

GET /my_index/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}
@Slf4j
@Service
public class ElasticSearchImpl {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    public void searchUser() throws IOException {
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        // range 查询
        RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder("price").gte(10).lte(20);
        searchSourceBuilder.query(rangeQueryBuilder);

        SearchRequest searchRequest = new SearchRequest(new String[]{"my_index"},searchSourceBuilder);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(searchResponse);
    }
}

到了这里,关于ElasticSearch序列 - SpringBoot整合ES:范围查询 range的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch系列 - SpringBoot整合ES之全文搜索匹配查询 match

    官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/index.html 权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/structured-search.html 1. 数据准备 官方测试数据下载地址:https://download.elastic.co/demos/kibana/gettingstarted/accounts.zip ,数据量很大,我们自己构造数据吧。 2. m

    2023年04月08日
    浏览(40)
  • ElasticSearch系列 - SpringBoot整合ES:短语匹配查询 match_phrase

    1. ElasticSearch match_phrase查询是什么?它与match查询有什么区别? match_phrase查询是一种用于匹配短语的查询方式,可以用于精确匹配多个单词组成的短语。它会将查询字符串分解成单词,然后按照顺序匹配文档中的单词,只有当文档中的单词顺序与查询字符串中的单词顺序完全

    2024年02月12日
    浏览(39)
  • ElasticSearch系列 - SpringBoot整合ES:多字段查询 multi_match

    1. 什么是 ElasticSearch 的 multi_match 查询? 有时用户需要在多个字段中查询,除了使用布尔查询封装多个match查询之外,可替代的方案是使用multi_match。可以在multi_match的query子句中组织数据匹配规则,并在fields子句中指定需要搜索的字段列表。 以下是一个示例multi-match查询

    2023年04月21日
    浏览(55)
  • ElasticSearch系列 - SpringBoot整合ES:查询字段不为空的文档 exists

    1. ElasticSearch exists 查询是什么 在某些场景下,我们希望找到某个字段不为空的文档,则可以用exists搜索。字段不为空的条件有: 值存在且不是 null; 值不是空数组; 值是数组,但不是 [null] 例如,查询在字段中至少有一个非空值的文档: 这些文档都将匹配上面的查询: ①

    2024年02月06日
    浏览(55)
  • ElasticSearch系列 - SpringBoot整合ES:查询条件 query 和过滤条件 filter 的区别

    01. Elasticsearch 查询条件和过滤条件的区别? Elasticsearch中的查询条件和过滤条件都是用于搜索和过滤文档的条件,但它们之间有一些区别。 查询条件是用于计算文档相关度得分的条件,它会将所有符合条件的文档按照相关度得分从高到低排序,并返回前N个文档。查询条件可以

    2024年02月14日
    浏览(45)
  • 【Elasticsearch】ES精确查询和范围查询,ES时间字段排序实例,ES倒排索引介绍

    termQuery matchQuery 模糊查询 multiMatchQuery 多个字段模糊查询 如果时间字段写入时用的类型是Text,可以用“时间字段.keyword”来处理 #查询前传入分页参数 #分页后拿到总记录数 把文档D对应到的映射转换为到文档ID的映射,每个都对应着一系列的文档,这些文

    2024年02月15日
    浏览(97)
  • ES Elasticsearch日期范围查询和查不出的坑

    如果字段为字符串类型,需要在字段后面加 .keyword 不加会出现查不出的问题。 查询全部,有大于2022-01-01的数据 按日期范围查询却没有查出来 字段后面加“.keyword”即可,分词问题

    2024年02月11日
    浏览(33)
  • Springboot整合Elasticsearch(Es)

    首先 在测试类中引入RestHighLevelClient对象 其次 准备一个User对象 3.1.1 创建索引  运行结果:创建成功返回true 3.1.2 删除索引 运行结果:删除成功返回true  3.1.3 判断索引是否存在 运行结果:存在返回true,不存在返回false. 3.2.1 添加文档 运行结果:添加成功返回 CREATED 3.2.2 查询文档--

    2023年04月22日
    浏览(32)
  • SpringBoot 整合 ES 进行各种高级查询搜索

    上一章:《ElasticSearch集群的搭建》 如果你还未安装es的相关信息,请先移步至:《ElasticSearch安装》进行安装 如果您的SpringBoot项目还未整合es,请移步至:《SpringBoot整合ElasticSearch实现模糊查询,批量CRUD,排序,分页,高亮》 同时本文的操作中涉及到ElasticSearchRepository和Ela

    2023年04月15日
    浏览(38)
  • ElasticSearch系列 - SpringBoot整合ES:ElasticSearch分析器

    1. ElasticSearch match 文本搜索的过程? Elasticsearch 的 match 查询是一种基于文本匹配的查询方式,它的搜索过程如下: ① 将查询字符串分词:Elasticsearch 会将查询字符串分成一个个词项(term),并去除停用词(如“的”、“是”等常用词汇)和标点符号等无意义的字符。 ② 构建

    2023年04月18日
    浏览(112)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包