一.创建测试数据

1.创建一个index

curl -X PUT  http://127.0.0.1:9200/student?pretty -H "Content-Type: application/json" -d '{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"_source": {
"enabled": true
},
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"class": {
"type": "text",
"analyzer": "ik_max_word"
},
"introduce": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}'

2.验证是否创建成功

curl -XGET "http://127.0.0.1:9200/student?pretty"

3.插入测试数据

curl -X PUT http://127.0.0.1:9200/student/_doc/1?pretty -H "Content-Type: application/json" -d '{
"id":1,
"name":"关云长",
"age":30,
"class":"蜀国一班"
}' curl -X PUT http://127.0.0.1:9200/student/_doc/2?pretty -H "Content-Type: application/json" -d '{
"id":2,
"name":"吕蒙",
"age":25,
"class":"吴国一班"
}' curl -X PUT http://127.0.0.1:9200/student/_doc/3?pretty -H "Content-Type: application/json" -d '{
"id":3,
"name":"吕布",
"age":40,
"class":"三姓一班"
}' curl -X PUT http://127.0.0.1:9200/student/_doc/4?pretty -H "Content-Type: application/json" -d '{
"id":4,
"name":"张翼德",
"age":30,
"class":"蜀国二班"
}'

4.查询所有数据,验证是否正确

curl -XGET http://127.0.0.1:9200/student/_search?pretty -H "Content-Type: application/json" -d '
{
"query": {
"match_all": {}
}
}'

二.验证


#关于term和match,下面两个查询,term没有结果,match有结果,为什么?
curl -XGET http://127.0.0.1:9200/student/_search?pretty -H "Content-Type: application/json" -d '{
"query": {
"term": {"name":"吕蒙"}
}
}' curl -XGET http://127.0.0.1:9200/student/_search?pretty -H "Content-Type: application/json" -d '{
"query": {
"match": {"name":"吕蒙"}
}
}'

拿A去B里匹配,A能分词,B也能分词。term不会将A分词,match会将A分词,存储数据类型keyword不会将B分词,text会将B分词。

  可以看到上面用term方式查找,没有结果,而用match方式查找,能查找到“吕蒙”和“吕布”两个结果

  term是不分词(不拆分搜索字)查找目标字段中是否有要查找的文字,也就是完整查找“吕蒙”两个字,而name这个字段用的是text类型存储的,text类型数据默认是分词的,也就是elasticsearch会将name分词后(分成“吕”和“蒙”)再存储,这时候拿完整的搜索字“吕蒙”去存储的“吕”、“蒙”里找肯定是找不到的。

  match是分词(拆分搜索字)查找目标字段,也就是说会先将要查找的搜索子“吕蒙”拆成“吕”和“蒙”,再分别去name里找“吕”,如果没有找到“吕”,还会去找“蒙”,而存储的数据里,text已经将“吕蒙”和“吕布”都分词成了“吕”,“蒙”,“吕”,“布”存储了,所以光通过一个“吕”字就能找到两条结果。

  这里要区分搜索词的分词,以及字段存储的分词。拿A去B里匹配,A能分词,B也能分词。term不会将A分词,match会将A分词。

  既然name的类型,存储的时候就是分词的,那能不能在存储的时候不分词了,可以用将text类型改成keyword类型

#删除所有文档
curl -XPOST "http://127.0.0.1:9200/student/_delete_by_query?pretty" -v -H "Content-Type: application/json" -d '
{
"query": {
"match_all": {}
}
}' #删除索引
curl -XDELETE "http://127.0.0.1:9200/student?pretty" #重新创建索引,将name字段的类型改成keyword
curl -X PUT http://127.0.0.1:9200/student?pretty -H "Content-Type: application/json" -d '{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"_source": {
"enabled": true
},
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "keyword"
},
"age": {
"type": "integer"
},
"class": {
"type": "text",
"analyzer": "ik_max_word"
},
"introduce": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}' #重新插入上面四条数据 #请复制上面的语句,执行 #下面这条查询将返回“吕蒙”同学
curl -XGET http://127.0.0.1:9200/student/_search?pretty -H "Content-Type: application/json" -d '{
"query": {
"term": {"name":"吕蒙"}
}
}' #下面这条查询将返回0结果,因为存储时类型为keyword没有分词,所以存储的是“吕蒙”和“吕布”,这时候拿#“吕”去匹配,没有匹配的结果
curl -XGET http://127.0.0.1:9200/student/_search?pretty -H "Content-Type: application/json" -d '{
"query": {
"term": {"name":"吕"}
}
}' #下面的结果将只会返回“吕蒙”同学,没有匹配的结果,因为存储时类型为keyword没有分词,所以存储的“吕
#蒙”和“吕布”,这时候拿“吕蒙”去匹配,虽然用的match,会将搜索词拆分成“吕蒙”,“吕”,“蒙”去搜索,但
#“吕”和“蒙”都不会匹配的到存储的“吕蒙”和“吕布”
curl -XGET http://127.0.0.1:9200/student/_search?pretty -H "Content-Type: application/json" -d '{
"query": {
"match": {"name":"吕蒙"}
}
}'

ElasticSearch中term和match探索的更多相关文章

  1. elasticsearch 中的Multi Match Query

    在Elasticsearch全文检索中,我们用的比较多的就是Multi Match Query,其支持对多个字段进行匹配.Elasticsearch支持5种类型的Multi Match,我们一起来深入 ...

  2. ES查询-term VS match (转)

    原文地址:https://blog.csdn.net/sxf_123456/article/details/78845437 elasticsearch 中term与match区别 term是精确查询 ...

  3. Elasticsearch 5.0 中term 查询和match 查询的认识

    Elasticsearch 5.0 关于term query和match query的认识 一.基本情况 前言:term query和match query牵扯的东西比较多,例如分词器.mapping ...

  4. Elasticsearch学习系列之term和match查询

    lasticsearch查询模式 一种是像传递URL参数一样去传递查询语句,被称为简单查询 GET /library/books/_search //查询index为library,type为book ...

  5. Elasticsearch学习系列之term和match查询实例

    Elasticsearch查询模式 一种是像传递URL参数一样去传递查询语句,被称为简单查询 GET /library/books/_search //查询index为library,type为boo ...

  6. Elasticsearch中的Term查询和全文查询

    目录 前言 Term 查询 exists 查询 fuzzy 查询 ids 查询 prefix 查询 range 查询 regexp 查询 term 查询 terms 查询 terms_set 查询 t ...

  7. 在Elasticsearch中查询Term Vectors词条向量信息

    这篇文章有点深度,可能需要一些Lucene或者全文检索的背景.由于我也很久没有看过Lucene了,有些地方理解的不对还请多多指正. 更多内容还请参考整理的ELK教程 关于Term Vectors 额, ...

  8. 如何在Elasticsearch中安装中文分词器(IK+pinyin)

    如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组. ...

  9. elasticsearch中常用的API

    elasticsearch中常用的API分类如下: 文档API: 提供对文档的增删改查操作 搜索API: 提供对文档进行某个字段的查询 索引API: 提供对索引进行操作,查看索引信息等 查看API: ...

随机推荐

  1. bit,byte,word,bps,Bps,比特,字节,字, 一图看懂

  2. JVM——类加载

    一.什么是类加载? JVM将class字节码文件加载到内存中, 并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class 对象,作为方法区类数据的访问入 ...

  3. CodeForces 494B Obsessive String ——(字符串DP+KMP)

    这题的题意就很晦涩.题意是:问有多少种方法,把字符串s划分成不重叠的子串(可以不使用完s的所有字符,但是这些子串必须不重叠),使得t串是所有这些新串的子串.譬如第一个样例,"ababa&qu ...

  4. 什么是文件的BOM头

    1.什么是BOM? BOM是用来判断文本文件是哪一种Unicode编码的标记,其本身是一个Unicode字符("\uFEFF"),位于文本文件头部. 在不同的Unicode编码中, ...

  5. Flask 生成下载文件

    1 后台程序直接生成文件内容 from flask import make_response @app.route('/testdownload', methods=['GET']) def test ...

  6. 消灭WinRAR广告

    1. 问题描述 WinRAR每次弹出的广告真的令人厌烦至极,虽然软件公司也得恰饭,免费给你用总得看俩广告吧,但是像我这样经常用WinRAR的人来说广告弹出频率未免也太过分了.一开始还只是用火绒的弹窗拦 ...

  7. R-CNN/Fast R-CNN/Faster R-CNN

    一.R-CNN 横空出世R-CNN(Region CNN,区域卷积神经网络)可以说是利用深度学习进行目标检测的开山之作,作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,2 ...

  8. linux中如何配置vim的别名为vi?

    答: 向~/.bashrc中添加如下内容: alias vi=vim

  9. context_processor 上下文处理器

    context_processor 上下文处理器 博客里面有三个地方用到了标签云:主页面,分类页面,博客详情页面,于是有了下面一段代码 # 主页面 @main.route("/") ...

  10. 001-log-log体系-log4j、jul、jcl、slf4j,日志乱象的归纳与统一

    一.概述 log4j→jul→jcl→slf4j之后就开始百花齐放[slf4j适配兼容新老用户] 1.1.log4j阶段 在JDK出现后,到JDK1.4之前,常用的日志框架是apache的log4j. ...