Elasticsearch: 使用文档权威指南 https:///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:///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 对中文分词稍微友好很多。我们还可以自定义分词器。