ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询
目录
ElasticSearch 实现分词全文检索 - 概述
ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装
ElasticSearch 实现分词全文检索 - Restful基本操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
ElasticSearch 实现分词全文检索 - 测试数据准备
ElasticSearch 实现分词全文检索 - term、terms查询
ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询
ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询
ElasticSearch 实现分词全文检索 - Scroll 深分页 --待发布
ElasticSearch 实现分词全文检索 - delete-by-query --待发布
ElasticSearch 实现分词全文检索 - 复合查询 --待发布
ElasticSearch 实现分词全文检索 - filter查询 --待发布
ElasticSearch 实现分词全文检索 - 高亮查询 --待发布
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality --待发布
ElasticSearch 实现分词全文检索 - 经纬度查询 --待发布
数据准备
ElasticSearch 实现分词全文检索 - 测试数据准备
id 查询
# id 查询
GET /sms-logs-index/_doc/1
Java
@Test
void idQuery() throws Exception{
    String indexName = "sms-logs-index";
    RestHighLevelClient client = ESClient.getClient();
    //1. 创建GetRequest对象
    GetRequest request = new GetRequest(indexName,"1");
    //2. 执行查询
    GetResponse resp = client.get(request, RequestOptions.DEFAULT);
    //4. 获取到  中的数据,并展示
    System.out.println(resp.getSourceAsMap());
}
ids 查询
根据多个ID查询,类似MySQL中的 where id in (1,2,3)
# ids 查询
GET /sms-logs-index/_search/
{
  "query": {
    "ids": {
      "values": ["1","2","3"]
    }
  }
}
Java
@Test
void idsQuery() throws Exception{
    String indexName = "sms-logs-index";
    RestHighLevelClient client = ESClient.getClient();
    //1. 创建GetRequest对象
    SearchRequest request = new SearchRequest(indexName);
    //2. 指定查询条件
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.idsQuery().addIds("1","2","3"));
    request.source(builder);
    //3. 执行查询
    SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
    //4. 获取到 _source 中的数据,并展示
    for (SearchHit hit : resp.getHits().getHits()) {
        Map<String, Object> result = hit.getSourceAsMap();
        System.out.println(result);
    }
}
prefix查询
前缀查询,可以通过一个关键字去指定一个Field的前缀,从而查询到指定的文档
# prefix 查询
GET /sms-logs-index/_search/
{
  "query": {
    "prefix": {
      "longCode": {
        "value": "李"
      }
    }
  }
}
Java
@Test
void prefixQuery() throws Exception{
    String indexName = "sms-logs-index";
    RestHighLevelClient client = ESClient.getClient();
    //1. 创建GetRequest对象
    SearchRequest request = new SearchRequest(indexName);
    //2. 指定查询条件
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.prefixQuery("longCode","李"));
    request.source(builder);
    //3. 执行查询
    SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
    //4. 获取到 _source 中的数据,并展示
    for (SearchHit hit : resp.getHits().getHits()) {
        Map<String, Object> result = hit.getSourceAsMap();
        System.out.println(result);
    }
}
fuzzy查询
模糊查询,我们输入字符的大概,ES就可以
# fuzzy 查询
GET /sms-logs-index/_search/
{
  "query": {
    "fuzzy": {
      "smsContent": {
        "value": "天天凯心", # 可以有错别字
        "prefix_length": 2  # 前N个字符,不允许出现错误,完本匹配
      }
    }
  }
}
Java
@Test
void fuzzyQuery() throws Exception{
    String indexName = "sms-logs-index";
    RestHighLevelClient client = ESClient.getClient();
    //1. 创建GetRequest对象
    SearchRequest request = new SearchRequest(indexName);
    //2. 指定查询条件
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.fuzzyQuery("smsContent","天天凯心").prefixLength(2));
    request.source(builder);
    //3. 执行查询
    SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
    //4. 获取到 _source 中的数据,并展示
    for (SearchHit hit : resp.getHits().getHits()) {
        Map<String, Object> result = hit.getSourceAsMap();
        System.out.println(result);
    }
}
wildcard 查询
通配查询,和MySQL中的 like 差不多,可以在查询时,在字符串中指定通配符 * 和占位符?
# wildcard 查询
GET /sms-logs-index/_search/
{
  "query": {
    "wildcard": {
      "smsContent": {
        "value": "天*"
      }
    }
  }
}
Java
@Test
void wildcardQuery() throws Exception{
    String indexName = "sms-logs-index";
    RestHighLevelClient client = ESClient.getClient();
    //1. 创建GetRequest对象
    SearchRequest request = new SearchRequest(indexName);
    //2. 指定查询条件
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.wildcardQuery("smsContent","天*"));
    request.source(builder);
    //3. 执行查询
    SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
    //4. 获取到 _source 中的数据,并展示
    for (SearchHit hit : resp.getHits().getHits()) {
        Map<String, Object> result = hit.getSourceAsMap();
        System.out.println(result);
    }
}
range 查询
范围查询,只针对数值类型,对某一个Field进行大于或小于的范围指定查询
# wildcard 查询
GET /sms-logs-index/_search/
{
  "query": {
    "range": {
      "fee": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}
Java
@Test
void rangeQuery() throws Exception{
    String indexName = "sms-logs-index";
    RestHighLevelClient client = ESClient.getClient();
    //1. 创建GetRequest对象
    SearchRequest request = new SearchRequest(indexName);
    //2. 指定查询条件
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.rangeQuery("fee").gte(10).lte(20));
    request.source(builder);
    //3. 执行查询
    SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
    //4. 获取到 _source 中的数据,并展示
    for (SearchHit hit : resp.getHits().getHits()) {
        Map<String, Object> result = hit.getSourceAsMap();
        System.out.println(result);
    }
}
regexp 查询
正则查询,通过你编写的正则表达式去匹配内容
PS:prefix,fuzzy,wildcard 和 regexp 查询效率相对比较低。要求效率比较高时,避免去使用]
# regexp 查询
POST /sms-logs-index/_search/
{
  "query": {
    "regexp": {
      "mobile": "1382[0-9]{7}" # 查询 1382开头的手机号
      }
    }
  }
}
Java
@Test
void regexpQuery() throws Exception{
    String indexName = "sms-logs-index";
    RestHighLevelClient client = ESClient.getClient();
    //1. 创建GetRequest对象
    SearchRequest request = new SearchRequest(indexName);
    //2. 指定查询条件
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.regexpQuery("mobile","1382[0-9]{7}"));
    request.source(builder);
    //3. 执行查询
    SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
    //4. 获取到 _source 中的数据,并展示
    for (SearchHit hit : resp.getHits().getHits()) {
        Map<String, Object> result = hit.getSourceAsMap();
        System.out.println(result);
    }
}
ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询的更多相关文章
- elasticsearch 拼音+ik分词,spring data elasticsearch 拼音分词
		elasticsearch 自定义分词器 安装拼音分词器.ik分词器 拼音分词器: https://github.com/medcl/elasticsearch-analysis-pinyin/rel ... 
- PHP+mysql数据库开发搜索功能:中英文分词+全文检索(MySQL全文检索+中文分词(SCWS))
		PHP+mysql数据库开发类似百度的搜索功能:中英文分词+全文检索 中文分词: a) robbe PHP中文分词扩展: http://www.boyunjian.com/v/softd/robb ... 
- ElasticSearch中文分词(IK)
		ElasticSearch常用的很受欢迎的是IK,这里稍微介绍下安装过程及测试过程. 1.ElasticSearch官方分词 自带的中文分词器很弱,可以体检下: [zsz@VS-zsz ~]$ c ... 
- 实战ELK(8) 安装ElasticSearch中文分词器
		安装 方法1 - download pre-build package from here: https://github.com/medcl/elasticsearch-analysis-ik/re ... 
- Elasticsearch 中文分词(elasticsearch-analysis-ik) 安装
		由于elasticsearch基于lucene,所以天然地就多了许多lucene上的中文分词的支持,比如 IK, Paoding, MMSEG4J等lucene中文分词原理上都能在elasticsea ... 
- Elasticsearch之分词器的作用
		前提 什么是倒排索引? Analyzer(分词器)的作用是把一段文本中的词按一定规则进行切分.对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的,所以对于不同的语言,要用不同的 ... 
- Elasticsearch之分词器的工作流程
		前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch的分词器的一般工作流程: 1.切分关键词 2.去除停用词 3.对于英文单词,把所有字母转为小写(搜索时不区分 ... 
- elasticsearch 中文分词(elasticsearch-analysis-ik)安装
		elasticsearch 中文分词(elasticsearch-analysis-ik)安装 下载最新的发布版本 https://github.com/medcl/elasticsearch-ana ... 
- elasticsearch kibana + 分词器安装详细步骤
		elasticsearch kibana + 分词器安装详细步骤 一.准备环境 系统:Centos7 JDK安装包:jdk-8u191-linux-x64.tar.gz ES安装包:elasticse ... 
- Elasticsearch修改分词器以及自定义分词器
		Elasticsearch修改分词器以及自定义分词器 参考博客:https://blog.csdn.net/shuimofengyang/article/details/88973597 
随机推荐
- JAVA XML转对象
			最近遇到XML转对象进行业务操作的问题 这是我需要解析的XML 1,建XML对应自己需要参数的Bean.有的很长很乱,没必要全部建,只建自己需要的就行了 import lombok.Data; imp ... 
- 1.JavaScript的实现与由来
			1.一个JavaScript由不同的部分组成 核心(ECMAScript)以下简称ES 文档对象模型(DOM) 浏览器对象模型(BOM) ES就是JavaScript的语法层面 而DOM则是浏览器解释 ... 
- 分布式接口幂等性、分布式限流:Guava 、nginx和lua限流
			接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用. 举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此 ... 
- 作业三:CART回归树
			作业三:CART回归树 20大数据三班 博客链接 学号 201613336 问题一: 表1为拖欠贷款人员训练样本数据集,使用CART算法基于该表数据构造决策树模型,并使用表2中测试样本集确定剪枝后的最 ... 
- 链表与malloc的疑惑
			1.奇怪点:如果我只是需要一个结点的空间为什么malloc的转换形式写成--Node=(int *)malloc(sizeof(int)) 自我解答:void *malloc(unsigned int ... 
- Python-pytest -> 在自动化测试中,如何切换不同的测试环境
			在构建自动化测试的脚本时候,我们可能会有不同环境的测试需求,如何实现在不同的测试环境之间切换呢?接下来介绍的这种方法,可以自定义命令行参数,从而根据不同的参数值实现不同环境的切换. 解决办法: 使用h ... 
- win  端口占用
			netstat -aon|findstr "8080" 查看端口 TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 11468 TCP 172.27.232 ... 
- 关闭Google自动更新
			一.禁用任务计划 二.禁用更新服务 三.重命名更新程序 首先找到谷歌浏览器的安装位置 
- Java基础进阶内容 - 随笔
			JAVA进阶 1 对象序列化 1.1 对象要序列化要实现Serializable接口 1.2 然后通过ObjectInputStream 对象读入流来读入一个对象 new ObjectOutputSt ... 
- python3.5升级到3.6
			第一步: sudo apt-get install software-properties-common sudo add-apt-repository ppa:jonathonf/python-3. ... 
