更多内容参考: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。那么查询的结果是包含分析得出的词的文档,即包含helloworld的全部文档。

对于不分词的字段:

只有查询的是 目标字段的精确值,才能匹配。

Elasticsearch——分词器对String的作用相关推荐

  1. elasticsearch分词器词库热更新三种方案

    文章目录 一.本地文件读取方式 二.远程扩展热更新 IK 分词 三.重写ik源码连接mysql 一.本地文件读取方式 首先进入elasticsearch目录的plugins目录下,查看目录结构 2.进 ...

  2. 3. ElasticSearch分词器和聚合,数据的丰富和去重

    ElasticSearch分词器和聚合,数据的丰富和去重 1. analyzer 1.1. 什么是analysis? 1.2. 如何定义一个定制的分析器 1.3. 中文分词器 2. Aggregati ...

  3. ElastIcSearch分词器

    ElastIcSearch分词器 Analysis 和 Analyzer Analysis: 文本分析是把全文本转换一系列单词(term/token)的过程,也叫分词(Analyzer).Analys ...

  4. 2、Elasticsearch分词器简介与使用(一)

    一.分词器的概念 1.Analysis Phase 在文档(Document)被添加到反向索引(inverted index)之前,Elasticsearch 对文档正文执行的过程称为分析阶段(Ana ...

  5. es过滤html标签,Elasticsearch 分词器

    在全文搜索(Fulltext Search)中,词(Term)是一个搜索单元,表示文本中的一个词,标记(Token)表示在文本字段中出现的词,由词的文本.在原始文本中的开始和结束偏移量.以及数据类型等 ...

  6. ElasticSearch——手写一个ElasticSearch分词器(附源码)

    1. 分词器插件 ElasticSearch提供了对文本内容进行分词的插件系统,对于不同的语言的文字分词器,规则一般是不一样的,而ElasticSearch提供的插件机制可以很好的集成各语种的分词器. ...

  7. elasticsearch分词器Jcseg安装手册

    Jcseg是什么? Jcseg是基于mmseg算法的一个轻量级中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了一个基于Jetty的web服务器,方便各大语言 ...

  8. Elasticsearch 分词器详解(热更新词库)

    1 分词器 text类型数据存入ES经过的步骤: 2 规范化(normalization) #采用默认分词器分词 GET _analyze {"analyzer": "s ...

  9. 【ES】Elasticsearch分词器使用和简单查询

    文章目录 Elasticsearch 一. analysis与analyzer 1.1 内置的分词器 1.2 内置分词器示例 1.3 中文分词 1.3.1 IK分词器 1.3.2 HanLP 1.3. ...

最新文章

  1. Oracle 优化相关
  2. HFileOutputFormat与TotalOrderPartitioner
  3. 小夕说,不了解动态空间增长的程序喵都是假喵(下)
  4. 「原创」从马云、马化腾、李彦宏的对话,看出三人智慧差在哪里?
  5. 配置汇编环境:使用vs2010+MASM
  6. 电商促销海报PSD分层模板,轻松搞定
  7. Java网络编程(一)- 一个简单的服务端/客户端应用程序
  8. 为什么勒索软件的预防如此重要?
  9. 魔鬼训练Day1作业
  10. HC05蓝牙模块AT指令与手机蓝牙控制STM32板载LED
  11. 装饰器(Decorator)模式
  12. 520,期待了不起的对象
  13. 学习win32汇编指令:lea和offset
  14. QT5.15.2__wind10 64 源码编译
  15. 国际音标(IPA)和美国音标(KK)对照表
  16. 将阿拉伯数字转换为中文大写数字 —— pyhton实现
  17. OpenVINO2022.1+open_model_zoo例程的编译与使用
  18. 一个画钟程序,终于做完了,作个记号
  19. 全面认识Android OS
  20. 基于微博的舆情监控系统 JAVA SSM MySQL

热门文章

  1. java基础(1)-几种获取类的扩展方式
  2. bzoj4195(并查集+离散化)
  3. 华科高级软件测试技术1704班-02组 如何计算团队成员贡献分
  4. 2016年深圳市宝安区小一学位申请流程及时间安排
  5. 摘自网络--浅析UpdatePanel的partial render原理
  6. 我就是古董店的那个店小二……专司收藏……
  7. Main函数参数argc,argv如何传入
  8. ztree 更新配置后重新渲染树_【问】zTree异步加载时添加父节点怎样避免再次加载整树...
  9. 南方s730手簿说明书_最新S730手簿及3.0简易操作82
  10. git push origin master Connection timed out