Elasticsearch——分词器对String的作用
更多内容参考:Elasticsearch学习总结
关于String类型——分词与不分词
在Elasticsearch中String是最基本的数据类型,如果不是数字或者标准格式的日期等这种很明显的类型,其他的一般都会优先默认存储成String。同样的数据类型,Elasticsearch也提供了多种存储与分词的模式,不同的模式应用于不同的场景。
很多人在初次使用Elasticsearch时,都会很纳闷...
- 为什么我存储的一句话,却查询不到?
- 为什么我输入了汉语单词,只能一个字一个字的匹配?
- 为什么我的url查询不到?
等等,这些都与是否分词、使用什么分词器有关。
首先说说什么是分词器吧! 比如我爱你中国
!
如果是标准分词器,会把它拆分成,“我”,“爱”,“你”,“中”,“国”。
如果使用一些汉语的分词器,则会分析成,“我”,“爱”,“你”,“中国”。
由于倒排索引都是以词Term为索引的,因此如果分解成了一个一个的词,查询“中国”
的时候,中国也会被分解成“中”
,“国”
,这样就可能误差到”发展中国家“
这样的词。
再说说Elasticsearch中的分词器吧!
不光是在索引文档(把数据导入到Elasticsearch中),在查询的时候也需要分词器。只有索引和查询的时候使用相同的分词器,才能查询出正确的结果。
但是有时候,我们并不想把一串String给分析,想把它当做一个完整的词。比如
www.baidu.com
吉林省 长春市 卫星路 6543号
此时,只要设置字段为不分析,就可以了。这时需要自定义下映射,因为默认String就是分析的,而且使用的是标准分词器。
准备工作
先建立一个索引
curl -XPUT localhost:9200/abc
然后定义映射,注意:只有刚刚新建、还没有任何数据的索引,才能定义映射。定义映射Mapping可以使用_mapping RESTAPI,符合下面的标准语法:
curl -XPUT localhost:9200/索引名称/类型名称/_mapping?pretty -d '{"类型名称":{"properties":{"字段名称":{"type":"字段类型","store":"是否存储","index":"索引方式、是否分析"}}}}'
比如,其中str1为String类型不分析;其他的字段str2为默认配置,就不用设置了。
curl -XPUT localhost:9200/abc/abc/_mapping?pretty -d '{"abc":{"properties":{"str1":{"type":"string","index":"not_analyzed"}}}}'
然后添加两条数据:
curl localhost:9200/abc/abc?pretty -d '{"str1":"hello, world!","str2":"goodbye! world"}'
{"_index" : "abc","_type" : "abc","_id" : "AVM2vRQgJmh5lL1r79nv","_version" : 1,"created" : true
}curl localhost:9200/abc/abc?pretty -d '{"str1":"hello","str2":"world"}' {"_index" : "abc","_type" : "abc","_id" : "AVM2vbbqJmh5lL1r79nw","_version" : 1,"created" : true
}
分析的String如何查询
如果查询的单个词,分词的字段可以使用term进行查询,如下所示:如果查询的是一个单独的词,那么会返回包含它或者等于它的目标文档。
curl -XPOST localhost:9200/abc/_search?pretty -d '{"query":{"term":{"str2":"world"}}}'
{"took" : 1,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"failed" : 0},"hits" : {"total" : 2,"max_score" : 0.5945348,"hits" : [ {"_index" : "abc","_type" : "abc","_id" : "AVM2vbbqJmh5lL1r79nw","_score" : 0.5945348,"_source":{"str1":"hello","str2":"world"}}, {"_index" : "abc","_type" : "abc","_id" : "AVM2vRQgJmh5lL1r79nv","_score" : 0.37158427,"_source":{"str1":"hello, world!","str2":"goodbye! world"}} ]}
}
不分析的String如何查询
如果字段是不分词的,而查询的是这个字段里面的一个词,那么使用term时无法查询到目标文档的。
$ curl -XPOST localhost:9200/abc/_search?pretty -d '{"query":{"term":{"str1":"hello"}}}'
{"took" : 1,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"failed" : 0},"hits" : {"total" : 1,"max_score" : 1.0,"hits" : [ {"_index" : "abc","_type" : "abc","_id" : "AVM2vbbqJmh5lL1r79nw","_score" : 1.0,"_source":{"str1":"hello","str2":"world"}} ]}
}
使用term查询,如果该字段是不分词,只有完整的输入目标字段,才能正确的匹配。
curl -XPOST localhost:9200/abc/_search?pretty -d '{"query":{"term":{"str1":"hello, world!"}}}'
{"took" : 2,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"failed" : 0},"hits" : {"total" : 1,"max_score" : 1.0,"hits" : [ {"_index" : "abc","_type" : "abc","_id" : "AVM2vRQgJmh5lL1r79nv","_score" : 1.0,"_source":{"str1":"hello, world!","str2":"goodbye! world"}} ]}
}
总结
对于分词的字段:
1 如果查询的是单个词,则查询到包含它的文档,返回结果与匹配程度有关
2 如果查询的是一段能被分析的话,比如hello world
。那么查询的结果是包含分析得出的词的文档,即包含hello
和world
的全部文档。
对于不分词的字段:
只有查询的是 目标字段的精确值,才能匹配。
Elasticsearch——分词器对String的作用相关推荐
- elasticsearch分词器词库热更新三种方案
文章目录 一.本地文件读取方式 二.远程扩展热更新 IK 分词 三.重写ik源码连接mysql 一.本地文件读取方式 首先进入elasticsearch目录的plugins目录下,查看目录结构 2.进 ...
- 3. ElasticSearch分词器和聚合,数据的丰富和去重
ElasticSearch分词器和聚合,数据的丰富和去重 1. analyzer 1.1. 什么是analysis? 1.2. 如何定义一个定制的分析器 1.3. 中文分词器 2. Aggregati ...
- ElastIcSearch分词器
ElastIcSearch分词器 Analysis 和 Analyzer Analysis: 文本分析是把全文本转换一系列单词(term/token)的过程,也叫分词(Analyzer).Analys ...
- 2、Elasticsearch分词器简介与使用(一)
一.分词器的概念 1.Analysis Phase 在文档(Document)被添加到反向索引(inverted index)之前,Elasticsearch 对文档正文执行的过程称为分析阶段(Ana ...
- es过滤html标签,Elasticsearch 分词器
在全文搜索(Fulltext Search)中,词(Term)是一个搜索单元,表示文本中的一个词,标记(Token)表示在文本字段中出现的词,由词的文本.在原始文本中的开始和结束偏移量.以及数据类型等 ...
- ElasticSearch——手写一个ElasticSearch分词器(附源码)
1. 分词器插件 ElasticSearch提供了对文本内容进行分词的插件系统,对于不同的语言的文字分词器,规则一般是不一样的,而ElasticSearch提供的插件机制可以很好的集成各语种的分词器. ...
- elasticsearch分词器Jcseg安装手册
Jcseg是什么? Jcseg是基于mmseg算法的一个轻量级中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了一个基于Jetty的web服务器,方便各大语言 ...
- Elasticsearch 分词器详解(热更新词库)
1 分词器 text类型数据存入ES经过的步骤: 2 规范化(normalization) #采用默认分词器分词 GET _analyze {"analyzer": "s ...
- 【ES】Elasticsearch分词器使用和简单查询
文章目录 Elasticsearch 一. analysis与analyzer 1.1 内置的分词器 1.2 内置分词器示例 1.3 中文分词 1.3.1 IK分词器 1.3.2 HanLP 1.3. ...
最新文章
- Oracle 优化相关
- HFileOutputFormat与TotalOrderPartitioner
- 小夕说,不了解动态空间增长的程序喵都是假喵(下)
- 「原创」从马云、马化腾、李彦宏的对话,看出三人智慧差在哪里?
- 配置汇编环境:使用vs2010+MASM
- 电商促销海报PSD分层模板,轻松搞定
- Java网络编程(一)- 一个简单的服务端/客户端应用程序
- 为什么勒索软件的预防如此重要?
- 魔鬼训练Day1作业
- HC05蓝牙模块AT指令与手机蓝牙控制STM32板载LED
- 装饰器(Decorator)模式
- 520,期待了不起的对象
- 学习win32汇编指令:lea和offset
- QT5.15.2__wind10 64 源码编译
- 国际音标(IPA)和美国音标(KK)对照表
- 将阿拉伯数字转换为中文大写数字 —— pyhton实现
- OpenVINO2022.1+open_model_zoo例程的编译与使用
- 一个画钟程序,终于做完了,作个记号
- 全面认识Android OS
- 基于微博的舆情监控系统 JAVA SSM MySQL
热门文章
- java基础(1)-几种获取类的扩展方式
- bzoj4195(并查集+离散化)
- 华科高级软件测试技术1704班-02组 如何计算团队成员贡献分
- 2016年深圳市宝安区小一学位申请流程及时间安排
- 摘自网络--浅析UpdatePanel的partial render原理
- 我就是古董店的那个店小二……专司收藏……
- Main函数参数argc,argv如何传入
- ztree 更新配置后重新渲染树_【问】zTree异步加载时添加父节点怎样避免再次加载整树...
- 南方s730手簿说明书_最新S730手簿及3.0简易操作82
- git push origin master Connection timed out