一、基本使用
1.索引
# 1.查看所有索引
GET _cat/indices
# 2.创建索引
PUT shopping
# 3.删除索引
DELETE shopping
2.文档
# 1.创建文档
# 指定ID
POST shopping/_doc/111
{
"category":"手机",
"brand":"华为"
}
# 自动生成ID
POST shopping/_doc
{
"category":"手机",
"brand":"华为"
}
# 2.查询
# 查询所有
GET shopping/_search
# 根据ID查询
GET shopping/_doc/111
# 3.更新
# 全量更新
PUT shopping/_doc/111
{
"name":"dfk",
"age":26
}
# 局部更新
POST shopping/_update/111
{
"doc":{
"name":"yjq"
}
}
# 4.查询
GET shopping/_search
{
"query": {
"match": {
"brand": "vivo"
}
}
}
GET shopping/_search
{
"query": {
"match_all": {}
}
}
# 分页查询
GET shopping/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 1
}
# 指定字段
GET shopping/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 3,
"_source": ["category"]
}
# 排序
GET shopping/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 5,
"sort": [
{
"age": {
"order": "asc"
}
}
]
}
# 多条件查询
GET shopping/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"brand": "vivo"
}
},
{
"match": {
"category": "手机"
}
}
]
}
}
}
# 范围查询
GET shopping/_search
{
"query": {
"bool": {
"filter": {
"range": {
"age": {
"gt": 23
}
}
}
}
}
}
# 高亮
GET shopping/_search
{
"query": {
"match": {
"学校": "西北大学"
}
},
"highlight": {
"fields": {
"学校":{}
}
}
}
3.聚合操作
- 按价格分组(size=0的意思是不要原始数据)

- 获取平均值

4.映射
PUT shopping
PUT shopping/_mapping
{
"properties":{
"name":{
"type":"text",
"index":true
},
"sex":{
"type":"keyword",
"index":true
},
"tel":{
"type":"keyword",
"index":false
}
}
}
二、分词器
引用链接:
[Elasticsearch ik分词器安装&分词过程] juejin.cn/post/700001…
[Elasticsearch中ik分词器的使用] juejin.cn/post/684490…
[Elasticsearch 7.X 中文分词器 ik 使用,及词库的动态扩展] blog.csdn.net/qq_43692950…
⭐️(150条消息) 【手把手】ElasticSearch的分词器相关查看es安装了哪些分词器FeenixOne的博客-CSDN博客 (更详细,包括字符串过滤器等,重点关注)
0.Term query和Mach query 区别
🅰️ Term query可以根据精确值查找相关文档数据。不过Term query查询与Match query查询还是有区别的,有时候你会发现用Match query可以查到,换成Term query却不行。
🅱️ 当使用Term query查询时,如果是text类型,会按照分词后的结果来进行匹配,而分词的规则,如果你掌握不好,那么查询时就很容易出错了。通常Term query针对的字段类型为keyword,Match query则是text类型。
1.安装中文分词器IK
ik分词器需要和es版本保持一致。
地址: elasticsearch-analysis-ik-7.8.0.zip
2.使用
⭐️ 重启es,加载分词器
GET _analyze?pretty
{
"analyzer":"ik_smart",
"text":"中华人民共和国国歌义勇军进行曲"
}
# 中华人民共和国 国歌 义勇军进行曲 (宁缺毋滥)
GET _analyze?pretty
{
"analyzer":"ik_max_word",
"text":"中华人民共和国国歌义勇军进行曲"
}
# 贪心
# analyzer 构建时分词
# search_analyzer 搜索时分词,无指定是使用 构建时分词器
# ik_smart 查准率,查询使用;ik_max_word 查全率,数据构建时使用;
# 如果 ik_smart 查询不奏效,使用 ik_max_word, 还不行;就另存一个字段 用 standard 字段
GET _analyze?pretty
{
"analyzer":"standard",
"text":"中华人民共和国国歌"
}
❗️ik_smart和ik_max_word配合使用
一般情况下,为了提高搜索的效果,需要这两种分词器配合使用。既索引时用ik_max_word尽可能多的分词,而搜索时用ik_smart尽可能提高匹配准度,让用户的搜索尽可能的准确。比如一个常见的场景,就是搜索"进口红酒"的时候,尽可能的不要出现口红相关商品或者让口红不要排在前面。
- 设定分词规则
PUT /goods
{
"mappings":{
"properties": {
"id": {
"type": "keyword"
},
"name": {
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart",
"type": "text",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"settings":{
"index": {
"refresh_interval": "1s",
"number_of_shards": 5,
"max_result_window": "10000000",
"number_of_replicas": 0
}
}
}
- 添加数据
POST /goods/_doc
{
"id":"1",
"name":"美丽粉色口红明星"
}
POST /goods/_doc
{
"id":"2",
"name":"好喝的进口红酒"
}
POST /goods/_doc
{
"id":"3",
"name":"进口红酒真好喝"
}
- 查询
# 指定查询分词器为ik_smart
GET /goods/_search
{
"query":{
"match": {
"name": {
"query": "进口红酒",
"analyzer": "ik_smart"
}
}
}
}
# 查询结果
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 1.4313363,
"hits" : [
{
"_index" : "goods",
"_type" : "_doc",
"_id" : "2SyBl4cBdQMYH9ypDQFH",
"_score" : 1.4313363,
"_source" : {
"id" : "2",
"name" : "好喝的进口红酒"
}
},
{
"_index" : "goods",
"_type" : "_doc",
"_id" : "CyyBl4cBdQMYH9ypFgYC",
"_score" : 0.5753642,
"_source" : {
"id" : "3",
"name" : "进口红酒真好喝"
}
}
]
}
}
总结:通过结合两种分词器使用,使返回结果指向更加明确。返回结果只有“进口红酒”,而没有无关的“口红”。
3.自定义扩展词汇
普通扩展
安装ik后,进入plugins/ik/config文件夹
前两个为扩展字典和停用词字典,可以自定义。
但是有一个缺点 :每次更新后需要重启es服务!
热更新
热更新需要借助nginx,配置文件需要修改被注释的第三、四两条。
详情见链接:(150条消息) Elasticsearch 7.X 中文分词器 ik 使用,及词库的动态扩展ik分词器动态更新词库索引小毕超的博客-CSDN博客
4.查询某个文档,某个字段的分词结果
GET /{index}/_doc/{id}/_termvectors?fields={fieldName}
GET personal_info/_doc/_D7gsYcBi0eSb9 "must": [
{
"bool": {
"should": [
{
"match": {
"college": "文学院"
}
},
{
"match": {
"political_outlook": "文学院"
}
}
]
}
},
{
"bool": {
"should": [
{
"match": {
"college": "党员"
}
},
{
"match": {
"political_outlook": "党员"
}
}
]
}
}
]_Cyg2w/_termvectors?fields=name
三、相似度评分算法
🌟blog.csdn.net/qq_40859560…^v85^pc_search_v2,239^v2^insert_chatgpt&utm_term=bm25&spm=1018.2226.3001.41877
TF-IDF是ES最初使用的评分算法,BM25在TF-IDF的基础上做出了改进,解决了大文档中的高词频评分过高问题,将TF的值限制在一定范围内。
ES的BM25算法中k1的默认值为1.2,b的默认值为0.75(工业实践与实验的结果)。
历史经验:
- 0<b<1,许多实验以0.1左右的增量测试值。大多数实验似乎表明最佳b的范围在0.3-0.9 (Lipani, Lupu, Hanbury, Aizawa (2015);Taylor, Zaragoza, Craswell, Robertson, Burges (2006);Trotman, Puurula, Burgess (2014);等等)。
- 0<k<3,0.1-0.2的增量。大多数实验似乎表明最佳的k1在0.5-2.0范围内。
四、ES排名优化
juejin.cn/post/685457… (强推!!!)
对 ES 搜索的优化应该把大部分精力花在文档数据质量提升和查询 DSL 组合调优上,需要反复尝试各种查询的组合和调整权重,在 DSL 的优化已经达到较好程度之前,尽量不要去优化相关性算法。
更不要在初期就引入太多的插件,例如近义词,拼音等,这样会影响你的优化,它们只是提高搜索召回率的工具,并不一定会提高准确率。更专业的平台应该做好更专业的搜索引导与建议,而不是让用户盲目的去尝试搜索。
1.DSL组合调优
-
bool查询的filter过滤器增加筛选
-
boost调整查询语句的权重 (match_phrase相对于match的权重通常更高)
-
静态评分(使用 function_score 增加更多的评分因素)
所谓的静态评分是针对文档来说的,与查询关键词没有关键词。比如:发布日期较新的文档权重更高,优质的文档权重更高。
一个DSL语句例子:
2.优化相关性算法
详情见上面链接☝️
五、部署
1.注册为服务
首先,进入bin文件夹下,打开命令提示符(管理员),
> elasticsearch-service install
接着,打开服务,启动。