ElasticSearch 7 学习记录

date
May 20, 2023
slug
ES7-learn
status
Published
tags
ElasticSearch
summary
ElasticSearch 7 概念、API、集成 Spring学习记录
type
Post
Language

安装

sudo mkdir elasticsearch
cd elasticsearch

# 安装 IK 分词器(版本必须与 ES 保持一致)
sudo mkdir -p plugins/ik
cd plugins/ik
sudo wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
sudo unzip elasticsearch-analysis-ik-7.6.2.zip

cd ../../
# 配置文件夹权限
sudo mkdir data
sudo chown -R 1000:root data
sudo chown -R 1000:root plugins

启动

# docker-compose.yaml
version: '3.3'
services:
  elasticsearch:
    image: elasticsearch:7.6.2
    container_name: elasticsearch
    environment:
      - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
      - "discovery.type=single-node" #以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms128m -Xmx256m" #设置使用jvm内存大小
    volumes:
      - ./plugins:/usr/share/elasticsearch/plugins #插件文件挂载
      - ./data:/usr/share/elasticsearch/data #数据文件挂载
    ports:
      - 8200:9200
      - 8300:9300
	sudo docker-compose up -d
测试
GET http://es:8200/_analyze
{
    "analyzer": "ik_max_word",
    "text": "安装 IK 分词器"
}
  • ik_max_word: 会将文本做最细粒度的拆分
  • ik_smart: 会做最粗粒度的拆分

概念

  • Index: 索引,类似于关系型数据库中的数据库
  • Mapper: 映射,类似于关系型数据库中的数据表结构
  • Document: 文档,类似于关系型数据库中的数据
  • Filed:字段,类似于关系型数据库中的表字段
  • Cluster: 集群
  • Node: 节点

类型

字符串:

  • text 用于全文索引,该类型的字段将通过分词器进⾏分词
  • keyword 不分词,只能搜索该字段的完整的值

数值型

  • long, integer, short, byte, double, float, half_float, scaled_float

数值型 boolean

  • boolean

二进制

  • binary 该类型的字段把值当做经过 base64 编码的字符串,默认不存储,且不可搜索

范围类型

  • 范围类型表示值是一个范围,而不是⼀个具体的值
  • integer_range, float_range, long_range, double_range, date_range
  • 比如 age 的类型是 integer_range,那么值可以是 {"gte" : 20, "lte" : 40};搜索 "term" : {"age": 21} 可以搜索该值

日期

  • date 由于 JSON 没有 date 类型,所以 ES 通过识别字符串是否符合 format 定义的格式来判断是否为date类型
  • format默认为:strict_date_optional_time||epoch_millis
  • "2022-01-01" "2022/01/01 12:10:30" 这种字符串格式

创建 index

# 创建名为 hello 的索引
PUT http://es:8200/hello

创建 mapper

PUT http://es:8200/hello/_mapping
{
    "properties": {
        "title": {
            "type": "text"
        },
        "name": {
            "type": "keyword"
        }
    }
}

创建 doc

POST http://es:8200/hello/_doc
{
    "title": "ES7教程",
    "name": "hello"
}

搜索

Term 精确搜索

  • term 查询被用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些 not_analyzed 的字符串
  • term 查询对于输入的文本不分析 ,所以它将给定的值进行精确查询
{
    "query":{
        "term":{
            "name": "hello"
        }
    }
}

Terms 多值精确搜索

  • terms 查询和 term 查询一样,但它允许你指定多值进行匹配,如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件
{
    "query":{
        "terms":{
            "name": ["hello", "world"]
        }
    }
}

Match 匹配搜索

  • 无论你在任何字段上进行的是全文搜索还是精确查询,match 查询是你可用的标准查询
  • 如果你在一个全文字段上使用 match 查询,在执行查询前,它将用正确的分析器去分析查询字符串
  • 如果在一个精确值的字段上使用它,例如数字、日期、布尔或者一个 not_analyzed 字符串字段,那么它将会精确匹配给定的值
{
    "query":{
        "match":{
            "name":"hello"
        }
    }
}
提高精度
可以使用 match 查询的 operator 参数来控制精度。默认情况下,match 查询使用 OR 操作符将查询字符串中的词汇与文档中的词汇进行匹配。但是,您可以使用 and 操作符将查询字符串中的词汇视为必须匹配的所有单词。
{
    "query": {
        "match": {
            "title": {      
                "query": "BROWN DOG!",
                "operator": "and"
            }
       }
    }
}
控制精度
match 查询支持 minimum_should_match 最小匹配参数,这让我们可以指定必须匹配的词项数用来表示一个文档是否相关。我们可以将其设置为某个具体数字,更常用的做法是将其设置为一个百分数,因为我们无法控制用户搜索时输入的单词数量。

 {
  "query": {
    "match": {
      "title": {
        "query": "quick brown dog",
        "minimum_should_match": "75%"
      }
    }
  }
}

Multi_Match 多字段匹配搜索

  • multi_match 查询可以在多个字段上执行相同的 match 查询
{
    "query": {
        "multi_match": {
            "query": "hello",
            "fields": [
                "name",
                "title"
            ]
        }
    }
}

Match_All 全部搜索

{
    "query":{
        "match_all":{
        }
    }
}

Rage 范围搜索

  • range 查询找出那些落在指定区间内的数字或者时间
  • 被允许的操作符如下
    • gt 大于
    • gte 大于等于
    • lt 小于
    • lte 小于等于
{
    "query":{
        "range":{
            "name":{
                "gte": 1
            }
        }
    }
}

组合多查询

bool 查询

可以用 bool 查询来实现你的需求。这种查询将多查询组合在一起,成为用户自己想要的布尔查询。它接收以下参数
  • must 文档必须匹配这些条件才能被包含进来。此条件会影响评分 _score
  • must_not 文档必须不匹配这些条件才能被包含进来。此条件不会影响评分 _score
  • should 如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
  • filter 必须匹配,但它不影响评分 _score、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

constant_score 查询

  • 尽管没有 bool 查询使用这么频繁,constant_score 查询也是你工具箱里有用的查询工具。它将一个不变的常量评分应用于所有匹配的文档。它被经常用于你只需要执行一个 filter 而没有其它查询(例如,评分查询)的情况下。
  • 可以使用它来取代只有 filter 语句的 bool 查询。在性能上是完全相同的,但对于提高查询简洁性和清晰度有很大帮助
{
    "constant_score":   {
        "filter": {
            "term": { "category": "ebooks" } 
        }
    }
}

Reference


© chobit blog 2025