ElasticSearch笔记(一)

204 阅读5分钟

一、基本使用

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的意思是不要原始数据) img
  • 获取平均值

img

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尽可能提高匹配准度,让用户的搜索尽可能的准确。比如一个常见的场景,就是搜索"进口红酒"的时候,尽可能的不要出现口红相关商品或者让口红不要排在前面。

  1. 设定分词规则
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
            }
  }
}
  1. 添加数据
POST /goods/_doc
{
  "id":"1",
  "name":"美丽粉色口红明星"
}
​
POST /goods/_doc
{
  "id":"2",
  "name":"好喝的进口红酒"
}
​
POST /goods/_doc
{
  "id":"3",
  "name":"进口红酒真好喝"
}
  1. 查询
# 指定查询分词器为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

补充:www.cnblogs.com/novwind/p/1…

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组合调优

  1. bool查询的filter过滤器增加筛选

  2. boost调整查询语句的权重 (match_phrase相对于match的权重通常更高)

  3. 静态评分(使用 function_score 增加更多的评分因素)

    所谓的静态评分是针对文档来说的,与查询关键词没有关键词。比如:发布日期较新的文档权重更高,优质的文档权重更高。

一个DSL语句例子:

img

2.优化相关性算法

详情见上面链接☝️

五、部署

1.注册为服务

首先,进入bin文件夹下,打开命令提示符(管理员),

> elasticsearch-service install

接着,打开服务,启动。