文章目录

  • Elasticsearch
    • 一. analysis与analyzer
      • 1.1 内置的分词器
      • 1.2 内置分词器示例
      • 1.3 中文分词
        • 1.3.1 IK分词器
        • 1.3.2 HanLP
        • 1.3.3 pinyin分词器
      • 1.4 中文分词演示
      • 1.5 分词的实际应用
        • 1.5.1 设置mapping
        • 1.5.2 插入数据
        • 1.5.3 查询
      • 1.6 拼音分词器
        • 1.6.1 设置settings
        • 1.6.2 设置mapping
        • 1.6.3 数据的插入
        • 1.6.4 查询
      • 1.7 中文、拼音混合查找
        • 1.7.1 设置settings
        • 1.7.2 mappings设置
        • 1.7.3 添加数据
        • 1.7.4 查询
    • 二. spring boot与Elasticsearch的整合
    • 2.1 添加依赖
    • 2.2 获取ElasticsearchTemplate
    • 2.3 POJO类的定义
    • 2.4 查询

Elasticsearch

一. analysis与analyzer

​ analysis(只是一个概念),文本分析是将全文本转换为一系列单词的过程,也叫分词。analysis是通过analyzer(分词器)来实现的,可以使用Elasticsearch内置的分词器,也可以自己去定制一些分词器。除了在数据写入的时候将词条进行转换,那么在查询的时候也需要使用相同的分析器对语句进行分析。

​ anaylzer是由三部分组成,例如有

Hello a World, the world is beautifu

1. Character Filter: 将文本中html标签剔除掉。
2. Tokenizer: 按照规则进行分词,在英文中按照空格分词。
3. Token Filter: 去掉stop world(停顿词,a, an, the, is),然后转换小写。

1.1 内置的分词器

分词器名称 处理过程
Standard Analyzer 默认的分词器,按词切分,小写处理
Simple Analyzer 按照非字母切分(符号被过滤),小写处理
Stop Analyzer 小写处理,停用词过滤(the, a, this)
Whitespace Analyzer 按照空格切分,不转小写
Keyword Analyzer 不分词,直接将输入当做输出
Pattern Analyzer 正则表达式,默认是\W+(非字符串分隔)

1.2 内置分词器示例

A. Standard Analyzer

GET _analyze
{"analyzer": "standard","text": "2 Running quick brown-foxes leap over lazy dog in the summer evening"
}

B. Simple Analyzer

GET _analyze
{"analyzer": "simple","text": "2 Running quick brown-foxes leap over lazy dog in the summer evening"
}

C. Stop Analyzer

GET _analyze
{"analyzer": "stop","text": "2 Running quick brown-foxes leap over lazy dog in the summer evening"
}

D. Whitespace Analyzer

GET _analyze
{"analyzer": "whitespace","text": "2 Running quick brown-foxes leap over lazy dog in the summer evening"
}

E. Keyword Analyzer

GET _analyze
{"analyzer": "keyword","text": "2 Running quick brown-foxes leap over lazy dog in the summer evening"
}

F. Pattern Analyzer

GET _analyze
{"analyzer": "pattern","text": "2 Running quick brown-foxes leap over lazy dog in the summer evening"
}

1.3 中文分词

​ 中文分词在所有的搜索引擎中都是一个很大的难点,中文的句子应该是切分成一个个的词,一句中文,在不同的上下文中,其实是有不同的理解,例如下面这句话:

这个苹果,不大好吃/这个苹果,不大,好吃
1.3.1 IK分词器

IK分词器支持自定义词库,支持热更新分词字典,地址为 https://github.com/medcl/elasticsearch-analysis-ik

elasticsearch-plugin.bat install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0.zip

安装步骤:

  1. 下载zip包,下载路径为:https://github.com/medcl/elasticsearch-analysis-ik/releases
  2. 在Elasticsearch的plugins目录下创建名为 analysis-ik 的目录,将下载好的zip包解压在该目录下
  3. 在dos命令行进入Elasticsearch的bin目录下,执行 elasticsearch-plugin.bat list 即可查看到该插件,然后重启elasticsearch.bat

IK分词插件对应的分词器有以下几种:

  • ik_smart
  • ik_max_word
GET _analyze
{"analyzer": "ik_smart","text": "特朗普5日接受采访时表示取消佛罗里达州的议程,他可能在白宫接受共和党总统候选人提名并发表演讲。"
}
GET _analyze
{"analyzer": "ik_max_word","text": "特朗普5日接受采访时表示取消佛罗里达州的议程,他可能在白宫接受共和党总统候选人提名并发表演讲。"
}
1.3.2 HanLP

安装步骤如下:

  1. 下载ZIP包,下载路径为:https://pan.baidu.com/s/1mFPNJXgiTPzZeqEjH_zifw#list/path=%2F,密码i0o7
  2. 在Elasticsearch的plugins目录下创建名为 analysis-hanlp 的目录,将下载好的elasticsearch-analysis-hanlp-7.4.2.zip包解压在该目录下.
  3. 下载词库,地址为:https://github.com/hankcs/HanLP/releases
  4. 将analyzer-hanlp目录下的data目录删掉,然后将词库 data-for-1.7.5.zip 解压到anayler-hanlp目录下
  5. 第2步 解压目录下的 config 文件夹中两个文件 hanlp.properties hanlp-remote.xml 拷贝到ES的根目录中的config目录下 的analysis-hanlp 文件夹中(analyzer-hanlp 目录需要手动去创建)。
  6. hanlp分词器安装的时候所需的文件\hanlp文件夹中提供的六个文件拷贝到 $ES_HOME\plugins\analysis-hanlp\data\dictionary\custom 目录下。
  7. 在dos命令行进入Elasticsearch的bin目录下,执行 elasticsearch-plugin.bat list 即可查看到该插件,然后重启elasticsearch.bat

HanLP对应的分词器如下:

  • hanlp,默认的分词
  • hanlp_standard,标准分词
  • hanlp_index,索引分词
  • hanlp_nlp,nlp分词
  • hanlp_n_short,N-最短路分词
  • hanlp_dijkstra,最短路分词
  • hanlp_speed,极速词典分词
GET _analyze
{"analyzer": "hanlp","text": "特朗普5日接受采访时表示取消佛罗里达州的议程,他可能在白宫接受共和党总统候选人提名并发表演讲。"
}
1.3.3 pinyin分词器

安装步骤:

  1. 下载ZIP包,下载路径为:https://github.com/medcl/elasticsearch-analysis-pinyin/releases
  2. 在Elasticsearch的plugins目录下创建名为 analyzer-pinyin 的目录,将下载好的elasticsearch-analysis-pinyin-7.4.2.zip包解压在该目录下.
  3. 在dos命令行进入Elasticsearch的bin目录下,执行 elasticsearch-plugin.bat list 即可查看到该插件,然后重启elasticsearch.bat

1.4 中文分词演示

ik_smart

GET _analyze
{"analyzer": "ik_smart","text": ["剑桥分析公司多位高管对卧底记者说,他们确保了唐纳德·特朗普在总统大选中获胜"]
}

hanlp

GET _analyze
{"analyzer": "hanlp","text": ["剑桥分析公司多位高管对卧底记者说,他们确保了唐纳德·特朗普在总统大选中获胜"]
}

hanlp_standard

GET _analyze
{"analyzer": "hanlp_standard","text": ["剑桥分析公司多位高管对卧底记者说,他们确保了唐纳德·特朗普在总统大选中获胜"]
}

hanlp_speed

GET _analyze
{"analyzer": "hanlp_speed","text": ["剑桥分析公司多位高管对卧底记者说,他们确保了唐纳德·特朗普在总统大选中获胜"]
}

1.5 分词的实际应用

​ 在如上列举了很多的分词器,那么在实际中该如何应用?

1.5.1 设置mapping

​ 要想使用分词器,先要指定我们想要对那个字段使用何种分词,如下所示:

# 先删除当前索引
DELETE user# 自定义某个字段的分词器
PUT user
{"mappings": {"properties": {"content": {"type": "text","analyzer": "hanlp_index"}}}
}
1.5.2 插入数据
POST user/_bulk
{"index":{}}
{"content":"如不能登录,请在百端登录百度首页,点击【登录遇到问题】,进行找回密码操作"}
{"index":{}}
{"content":"网盘客户端访问隐藏空间需要输入密码方可进入。"}
{"index":{}}
{"content":"剑桥的网盘不好用"}
1.5.3 查询
GET user/_search
{"query": {"match": {"content": "密码"}}
}

1.6 拼音分词器

​ 在查询的过程中我们可能需要使用拼音来进行查询,在中文分词器中我们介绍过 pinyin 分词器,那么在实际的工作中该如何使用呢?

1.6.1 设置settings
PUT /medcl
{"settings" : {"analysis" : {"analyzer" : {"pinyin_analyzer" : {"tokenizer" : "my_pinyin"}},"tokenizer" : {"my_pinyin" : {"type" : "pinyin","keep_separate_first_letter" : false,"keep_full_pinyin" : true,"keep_original" : true,"limit_first_letter_length" : 16,"lowercase" : true,"remove_duplicated_term" : true}}}}
}

如上所示,我们基于现有的拼音分词器定制了一个名为 pinyin_analyzer 这样一个分词器。可用的参数可以参照:https://github.com/medcl/elasticsearch-analysis-pinyin

1.6.2 设置mapping
PUT medcl/_mapping
{"properties": {"name": {"type": "keyword","fields": {"pinyin": {"type": "text","analyzer": "pinyin_analyzer","boost": 10}}}}
}
1.6.3 数据的插入
POST medcl/_bulk
{"index":{}}
{"name": "马云"}
{"index":{}}
{"name": "马化腾"}
{"index":{}}
{"name": "李彦宏"}
{"index":{}}
{"name": "张朝阳"}
{"index":{}}
{"name": "刘强东"}
1.6.4 查询
GET medcl/_search
{"query": {"match": {"name.pinyin": "zcy"}}
}

1.7 中文、拼音混合查找

1.7.1 设置settings
PUT product
{"settings": {"analysis": {"analyzer": {"hanlp_standard_pinyin":{"type": "custom","tokenizer": "hanlp_standard","filter": ["my_pinyin"]}},"filter": {"my_pinyin": {"type" : "pinyin","keep_separate_first_letter" : false,"keep_full_pinyin" : true,"keep_original" : true,"limit_first_letter_length" : 16,"lowercase" : true,"remove_duplicated_term" : true}}}}
}
1.7.2 mappings设置
PUT product/_mapping
{"properties": {"content": {"type": "text","analyzer": "hanlp_standard_pinyin"}}
}
1.7.3 添加数据
POST product/_bulk
{"index":{}}
{"content":"如不能登录,请在百端登录百度首页,点击【登录遇到问题】,进行找回密码操作"}
{"index":{}}
{"content":"网盘客户端访问隐藏空间需要输入密码方可进入。"}
{"index":{}}
{"content":"剑桥的网盘不好用"}
1.7.4 查询
GET product/_search
{"query": {"match": {"content": "wangpan"}},"highlight": {"pre_tags": "<em>","post_tags": "</em>","fields": {"content": {}}}
}
属性名 解释
keep_first_letter true: 将所有汉字的拼音首字母拼接到一起:李小璐 -> lxl
keep_full_pinyin true:在最终的分词结果中,会出现每个汉字的全拼:李小璐 -> li , xiao, lu
keep_none_chinese true: 是否保留非中文本,例如 java程序员, 在最终的分词结果单独出现 java
keep_separate_first_lett true: 在最终的分词结果单独将每个汉字的首字母作为一个结果:李小璐 -> l, y
keep_joined_full_pinyin true:在最终的分词结果中将所有汉字的拼音放到一起:李小璐 -> liuyan
keep_none_chinese_in_joined_full_pinyin true:将非中文内容文字和中文汉字拼音拼到一起
none_chinese_pinyin_tokenize true: 会将非中文按照可能的拼音进行拆分:wvwoxvlu -> w, v, wo, x, v, lu
keep_original true: 保留原始的输入
remove_duplicated_term true: 移除重复

二. spring boot与Elasticsearch的整合

2.1 添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2.2 获取ElasticsearchTemplate

package com.qf.config;import org.apache.http.HttpHost;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport;
import org.springframework.data.elasticsearch.core.ElasticsearchEntityMapper;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.EntityMapper;import java.net.InetAddress;
import java.net.UnknownHostException;@Configuration
public class ElasticSearchConfig extends ElasticsearchConfigurationSupport {@Beanpublic Client elasticsearchClient() throws UnknownHostException {Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();TransportClient client = new PreBuiltTransportClient(settings);client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));return client;}@Bean(name = {"elasticsearchOperations", "elasticsearchTemplate"})public ElasticsearchTemplate elasticsearchTemplate() throws UnknownHostException {return new ElasticsearchTemplate(elasticsearchClient(), entityMapper());}// use the ElasticsearchEntityMapper@Bean@Overridepublic EntityMapper entityMapper() {ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(elasticsearchMappingContext(),new DefaultConversionService());entityMapper.setConversions(elasticsearchCustomConversions());return entityMapper;}
}

2.3 POJO类的定义

@Document(indexName = "movies", type = "_doc")
public class Movie {private String id;private String title;private Integer year;private List<String> genre;// setters and getters
}

2.4 查询

A. 分页查询

// 分页查询
@RequestMapping("/page")
public Object pageQuery(@RequestParam(required = false, defaultValue = "10") Integer size,@RequestParam(required = false, defaultValue = "1") Integer page) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withPageable(PageRequest.of(page, size)).build();List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);return movies;
}

B. range查询

// 单条件范围查询, 查询电影的上映日期在2016年到2018年间的所有电影
@RequestMapping("/range")
public Object rangeQuery() {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(new RangeQueryBuilder("year").from(2016).to(2018)).build();List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);return movies;
}

C. match查询

// 单条件查询只要包含其中一个字段
@RequestMapping("/match")
public Object singleCriteriaQuery(String searchText) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(new MatchQueryBuilder("title", searchText)).build();List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);return movies;
}

D. 多条件分页查询

@RequestMapping("/match/multiple")
public Object multiplePageQuery(@RequestParam(required = true) String searchText,@RequestParam(required = false, defaultValue = "10") Integer size,@RequestParam(required = false, defaultValue = "1") Integer page) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(new BoolQueryBuilder().must(new MatchQueryBuilder("title", searchText)).must(new RangeQueryBuilder("year").from(2016).to(2018))).withPageable(PageRequest.of(page, size)).build();List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);return movies;
}

E. 多条件或者查询

@RequestMapping("/match/or/multiple")
public Object multipleOrQuery(@RequestParam(required = true) String searchText) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(new BoolQueryBuilder().should(new MatchQueryBuilder("title", searchText)).should(new RangeQueryBuilder("year").from(2016).to(2018))).build();List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);return movies;
}

F. 精准匹配一个单词,且查询就一个单词

//其中包含有某个给定单词,必须是一个词
@RequestMapping("/term")
public Object termQuery(@RequestParam(required = true) String searchText) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(new TermQueryBuilder("title", searchText)).build();List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);return movies;
}

精准匹配多个单词

//其中包含有某个几个单词
@RequestMapping("/terms")
public Object termsQuery(@RequestParam(required = true) String searchText) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(new TermsQueryBuilder("title", searchText.split("\\s+"))).build();List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);return movies;
}

G. 短语匹配

@RequestMapping("/phrase")
public Object phraseQuery(@RequestParam(required = true) String searchText) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(new MatchPhraseQueryBuilder("title", searchText)).build();List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);return movies;
}

H. 只查询部分列

@RequestMapping("/source")
public Object sourceQuery(@RequestParam(required = true) String searchText) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withSourceFilter(new FetchSourceFilter(new String[]{"title", "year", "id"}, new String[]{})).withQuery(new MatchPhraseQueryBuilder("title", searchText)).build();List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);return movies;
}

I. 多字段匹配

@RequestMapping("/multiple/field")
public Object allTermsQuery(@RequestParam(required = true) String searchText) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(new MultiMatchQueryBuilder(searchText, "title", "genre").type(MultiMatchQueryBuilder.Type.MOST_FIELDS)).build();List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);return movies;
}

J. 多单词同时包含

// 多单词同时包含
@RequestMapping("/also/include")
public Object alsoInclude(@RequestParam(required = true) String searchText) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(new QueryStringQueryBuilder(searchText).field("title").defaultOperator(Operator.AND)).build();List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);return movies;
}

【ES】Elasticsearch分词器使用和简单查询相关推荐

  1. ELK系列(十)、ES中文分词器IK插件安装和配置远程词库热加载

    简介 IK Analyzer是一个开源的,基于Java语言开发的轻量级的中文分词工具包: 最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件:从 3.0 版本开始 ...

  2. ELK下es的分词器analyzer

    转载链接 :es的分词器analyzerhttps://www.cnblogs.com/xiaobaozi-95/p/9328948.html 中文分词器 在lunix下执行下列命令,可以看到本来应该 ...

  3. ElastIcSearch分词器

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

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

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

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

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

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

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

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

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

  8. 【Elasticsearch】es IK分词器的安装

    1.概述 [Elasticsearch]es 7.8.0 唐诗三百首写入 Elasticsearch 会发生什么 之前我们创建索引,查询数据,都是使用的默认的分词器,分词效果不太理想,会把text的字 ...

  9. elasticsearch分词器Jcseg安装手册

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

最新文章

  1. 支撑亿级用户“刷手机”​,百度Feed流背后的新技术装备有多牛?
  2. vba 在光标插入文字_VBA学习入门方法!Office Excel教程 Excel入门 Excel技巧 Excel学习!...
  3. 将页面转发到用户登录页面
  4. jq第一天(1.83里面的属性)属性-》属性
  5. 如何查看Kubernetes pod yaml文件的在线语法帮助
  6. VS2010中添加lib库引用
  7. JDBC操作数据库就这八步!
  8. ap接口 php_2018年小米高级 PHP 工程师面试题(模拟考试卷)
  9. shell中日期的使用当前日期的加减
  10. mac搭建svn服务器文件被锁定,MAC搭建SVN服务器并配置Cornerstone
  11. Mybatis_day2_Mybatis的CRUD操作
  12. 大数据可视化平台有什么优势
  13. 手机模拟门禁卡!NFC蓝牙读卡器!
  14. 源恒房地产税务软件土地增值税清算系统
  15. Office、excel、word卡死(或卡顿后自动恢复)的解决方案
  16. 第三阶段应用层——1.11 数码相册—setting_page设置页面的显存管理、页面规划、输入控制
  17. Android安装步骤
  18. 如何用计算机名查看共享打印机,如何查找网络共享打印机
  19. 计算机网络学习笔记一
  20. 苹果邮箱怎么登录qq邮箱_邮箱格式怎么写 电子邮箱格式怎么写

热门文章

  1. linux2012年上机测试,linux上机复习题(部分答案)
  2. Cayley n顶点树数定理
  3. 换个角度,智能硬件也能这样玩
  4. I2C协议精讲(二):I2C上拉电阻计算
  5. Ubuntu18.04.3 手动设置IP地址和DNS
  6. moveit! 与 gazebo 仿真中的问题:Unable to identify any set of controllers that can actuate the specified...
  7. 21.5 Strem流
  8. 微信小程序之数据埋点——阿拉丁
  9. 剑指Offer---2021/7/19
  10. 【慕课笔记】用技术打造小程序简历_3设计简历封面