系列课程 ElasticSearch 之第 5 篇 —— Kibana 高级查询语句、DSL语言查询和过滤、中文分词器(elasticsearch.bat闪退解决办法)

 

Elasticsearch: 使用文档权威指南 https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html 

 

OK,我们先使用 Kibana 生成一些文档数据:

PUT /biandan/user/zhangsan
{
  "name":"张三",
  "job":"Java工程师",
  "sign":"走别人的路,让别人无路可走。",
  "age":20
}

PUT /biandan/user/lisi
{
  "name":"李四",
  "job":"Python工程师",
  "sign":"既然选择了远方,便只顾风雨兼程。",
  "age":25
}

PUT /biandan/user/wangwu
{
  "name":"王五",
  "job":"C++工程师",
  "sign":"世界因有你而精彩。",
  "age":30
}

PUT /biandan/user/zhuliu
{
  "name":"朱六",
  "job":"PHP工程师",
  "sign":"岁月不仅磨平了你的棱角,还会把它抛光。",
  "age":35
}

PUT /biandan/user/zhuoqi
{
  "name":"卓七",
  "job":"大数据工程师",
  "sign":"只要不测试,就不会有bug!",
  "age":40
}

 

1、根据 ID 查询,语法: GET /索引名/类型/ID

GET /biandan/user/zhangsan

 

2、查询某个类型下的所有文档,语法:GET /索引名/类型/_search

GET /biandan/user/_search

 

3、根据多个ID批量查询,语法:GET /索引名/类型/_mget  然后用 json 传递 ids

GET /biandan/user/_mget
{
  "ids":["zhangsan","lisi"]
}

4、复杂条件查询,语法:GET /索引名/类型/_search?q=条件:XX

①查询年龄等于25岁:

GET /biandan/user/_search?q=age:25

②查询年龄小于等于25岁:注意,使用中括号,* 表示所有,TO 必须大写。

GET /biandan/user/_search?q=age[* TO 25]

 

③查询年龄在25到40岁之间,年龄降序排,只取2条:

GET /biandan/user/_search?q=age[25 TO 40]&sort=age:desc&from=0&size=2

④查询年龄在20到30岁之间,年龄升序排,只取第一条,展示姓名name、职业job。

GET /biandan/user/_search?q=age[25 TO 30]&sort=age:asc&from=0&size=1&_source=name,job

 

DSL语言查询和过滤

ElasticSearch 中的查询请求有两种方式,一种是简易版的查询(上面的例子),另外一种是使用 JSON 完整的请求体,叫做结构化查询(domain-specific language)。

DSL查询是POST过去一个 JSON,由于Post的请求是 json 格式的,所以存在很多灵活性,也有很多形式。

term 关键字:精确查询

1、根据年龄精确查询【25岁】:(类似 MySQL 中的“等于”查询,Java中的 equals 函数)

GET /biandan/user/_search
{
  "query": {
    "term": {
      "age":25
    }
  }
}

注意:现在不能匹配中文,否则出错,问题在后面继续追踪(也搞了挺久):

#! [types removal] Specifying types in search requests is deprecated.
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}

 

2、match 关键字模糊匹配(类似数据库中的 like 关键字)

查询 job =【C++】

GET /biandan/user/_search
{
  "query": {
    "match": {
      "job": "C++"
    }
  }
}

结果:

 

3、分页查询 job包含【工程师】并且年龄在20~35岁的,取前2条数据,只展示【name、job】字段:

GET /biandan/user/_search
{
  "query": {
    "bool": {
      "must": [{
          "match":{
              "job": "工程师"
            }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gt": 20,
            "lte": 35
          }
        }
      }
    }
  },
  "from": 0,
  "size": 2,
  "_source": ["name","job"]
}

结果:

 

中文分词器

Elasticsearch 中默认的标准分词器对中文分词不是很友好,会将中文词语拆分成一个个中文的汉字。因此需要引入中文分词器 es-ik 插件。

ES-IK 插件下载地址(注意 ik 的版本一定要对应 ES 的版本):https://github.com/medcl/elasticsearch-analysis-ik/releases

下载压缩包之后,把压缩包复制到 ElasticSearch 的 plugins 目录下,然后解压到当前压缩包的名字。如图:

 

然后将文件夹重命名为 ik,并且删掉压缩包。

结果如图:

如果遇到启动 elasticsearch.bat 闪退的情况,请按照上面的方法处理!

然后重启 ElasticSearch 服务,看到以下输出就是正确的了。

 

OK,我们用 postman 测试中文分词器。

首先,我们先用原生自带的标准分词器 standard(基本没人用),发送 POST 请求到:127.0.0.1:9200/_analyze,如图:

发现把【王者荣耀】拆分成王、者、荣、耀了。这不是我们想要的结果。

接下来,我们使用中文分词器:ik_smart

我们发现,ik_smart 对中文分词稍微友好很多。我们还可以自定义分词器。

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值