在项目中根据条件搜索是很常见的功能,但是当数据量比较大时,使用mysql中模糊搜索性能会达到瓶颈。除此之外,我们在购物时商品的搜索也会使用ES来达到快速检索的目地。本文中介绍ES的常见使用,在windows环境中使用的版本为7.10.1,
ES的安装
下载windows版本的ElasticSearch,双击.bat文件,启动后访问 http://localhost:9200/,出现ES版本相关信息时,表示启动成功
下载kibana客户端,双击.bat文件,访问http://localhost:5601/
点击dev tools,就可以使用DSL语句测试各项功能
分词器的介绍
ik分词器
Elasticsearch默认使用的分词器是Standard Analyzer(标准分析器),标准分词器对英文分词比较友好,按空格划分英文单词,但是对于中文也是逐个字划分,因此并不适用于中文分词。查看默认的标准分词器的分词示例:
POST /_analyze
{
"analyzer": "standard",
"text": "hi how are you 查看展示"
}
分词结果
{
"tokens" : [
{
"token" : "hi",
"start_offset" : 0,
"end_offset" : 2,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "how",
"start_offset" : 3,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "are",
"start_offset" : 7,
"end_offset" : 10,
"type" : "<ALPHANUM>",
"position" : 2
},
{
"token" : "you",
"start_offset" : 11,
"end_offset" : 14,
"type" : "<ALPHANUM>",
"position" : 3
},
{
"token" : "查",
"start_offset" : 15,
"end_offset" : 16,
"type" : "<IDEOGRAPHIC>",
"position" : 4
},
{
"token" : "看",
"start_offset" : 16,
"end_offset" : 17,
"type" : "<IDEOGRAPHIC>",
"position" : 5
},
{
"token" : "展",
"start_offset" : 17,
"end_offset" : 18,
"type" : "<IDEOGRAPHIC>",
"position" : 6
},
{
"token" : "示",
"start_offset" : 18,
"end_offset" : 19,
"type" : "<IDEOGRAPHIC>",
"position" : 7
}
]
}
相较于默认的标准分词器,ik分词器主要用于中文,它采用自然语言识别处理算法,根据词库和规则进行中文分词,会划分成比较合理的词语,那么如何安装ik分词器呢?
ik分词器的安装是以插件的形式安装,下载对应ES版本的ik分词器,解压后的文件夹放到ES安装目录的plugins文件中
重新启动ES后即可使用ik分词器,ik分词示例查看前后对比
POST /_analyze
{
"analyzer": "ik_smart",
"text": "hi how are you 查看展示"
}
{
"tokens" : [
{
"token" : "hi",
"start_offset" : 0,
"end_offset" : 2,
"type" : "ENGLISH",
"position" : 0
},
{
"token" : "how",
"start_offset" : 3,
"end_offset" : 6,
"type" : "ENGLISH",
"position" : 1
},
{
"token" : "you",
"start_offset" : 11,
"end_offset" : 14,
"type" : "ENGLISH",
"position" : 2
},
{
"token" : "查看",
"start_offset" : 15,
"end_offset" : 17,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "展示",
"start_offset" : 17,
"end_offset" : 19,
"type" : "CN_WORD",
"position" : 4
}
]
}
HanLP分词器
HanLP也是中文的一个分词器。它采用了深度学习等先进技术,分词粒度较细,能够将中文文本拆解成较为准确的词语。HanLP分词器的安装同样需要下载相同版本的源码
https://github.com/KennFalcon/elasticsearch-analysis-hanlp/releases
将下载的文件解压后,目录中的data拷贝到ES的data文件中,config中的文件拷贝到ES的Config文件夹下,并修改文件名为analysis-hanlp
将解压缩文件夹下除了data和config的文件拷贝到ES的plugins中新建文件夹下analysis-hanlp
修改config配置文件中hanlp.properties中root的值
另修改plugin-security.policy文件的内容为
重启ES进行测试
常用功能总结
创建索引与映射
示例:
PUT /indexdemo
{
"mappings": {
"properties": {
"name":{
"type":"text",
"analyzer":"ik_smart"
},
"brand":{
"type":"keyword"
},
"address":{
"type":"text",
"analyzer":"ik_smart"
},
"tel":{
"type":"integer",
"index":"false"
},
"price":"double"
}
}
}
文档操作
插入文档
POST /indexdemo/_doc/1
{
"name":"烧烤",
"brand":"淄博",
"address":"山东烧烤",
"tel":"1234324"
}
修改文档
局部修改文档中的信息
#修改文档
POST /indexdemo/_update/1
{
"doc":{
"tel":"12121212"
}
}
全量修改文档的信息,删除原来文档信息后新增
PUT /indexdemo/_doc/1
{
"name":"烧烤1",
"brand":"淄博1",
"address":"山东烧烤1",
"tel":"1234324"
}
查看、删除文档
#查看文档
GET /indexdemo/_doc/1
#删除文档
DELETE /indexdemo/_doc/1
查询
查看所有文档
#查看所有
GET /indexdemo/_search
{
"query": {
"match_all": {}
}
}
全文检索
GET /indexdemo/_search
{
"query": {
"match": {
"name": "涮"
}
}
}
精确查询
GET /indexdemo/_search
{
"query": {
"term": {
"brand": {
"value": "小店"
}
}
}
}
范围查询
GET /indexdemo/_search
{
"query": {
"range": {
"price": {
"gte": "50",
"lte":"100"
}
}
}
}
复合查询 Boolean Query
GET /indexdemo/_search
{
"query": {
"bool": {
"must": [
{
"match":{
"name": "涮"
}
}
],
"must_not": [
{
"range": {
"price": {
"lte": 22
}
}
}
],
"should":[
{
"term":{
"brand":"小店"
}
}
],
"filter": [
{
"match":{
"address":"网红"
}
}
]
}
}
}
模糊查询
fuzziness:表示允许输入差异字符的个数
prefix_length:表示前几个字符需要是精确匹配的
GET /indexdemo/_search
{
"query": {
"fuzzy": {
"name": {
"value": "虾好吃",
"fuzziness": 2,
"prefix_length": 1
}
}
}
}
分页
from :指数据开始得到偏移量,可有(页数-1)*每页展示数量获取
size: 每页获取的条数
#分页
GET /indexdemo/_search
{
"query": {
"match_all": {}
},
"from":0,
"size":3
}
排序
价格升序
GET /indexdemo/_search
{
"query": {
"match_all": {}
},
"sort":[
{
"price": "asc"
}
]
}
高亮
查询词结果高亮
#高亮
GET /indexdemo/_search
{
"query": {
"match": {
"name":"涮"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
扩展词
在ik分词器的配置文件中,可以设置扩展的词汇以及停用词
同义词
设置同义词能够增加搜索匹配的数据,通过自定义同义词分词器来实现
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "ik_smart",
"filter": ["lowercase", "my_synonym"]
}
},
"filter": {
"my_synonym": {
"type": "synonym",
"synonyms_path": "H:/SoftWare/es/elasticsearch-7.10.1/elasticsearch-7.10.1/elasticsearch-7.10.1/config/synonyms.txt"
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
设置同义词的文件
测试数据:
PUT /my_index/_doc/1
{
"name":"开心"
}
PUT /my_index/_doc/2
{
"name":"高兴"
}
GET /my_index/_search
{
"query": {
"match": {
"name": "开心"
}
}
}
设置为同义词的数据,也能搜索到
词典扩展
随着时间的发展,新的词汇在增加,扩展词汇的设置就是为了能够提升新增词汇的识别,从而能够更贴切的划分语句
在添加之前,奥利给的分词展示
添加扩展词配置之后
会被当成一个词语
停用词设置
一些无实际意义的词语,例如:啊、哈、呵,这些词汇不需要分词,将这些词汇设置在停用词文件中,分词后不会显示即不会划分成词