Elasticsearch初识及简单操作

Lucene

是Apache软件基金会4 jakarta项目的子项目。它是一个开源的全文检索引擎工具包。但它并不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)

相当于一个库, 还有很多东西要自己写.

ElasticSearch

权威指南: https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

es中文社区: https://elasticsearch.cn/

Elasticsearch 是一个基于Lucene 搜索引擎为核心构建的开源,分布式,RESTful搜索服务器。它是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据。 具体体现在全文检索、结构化搜索、分析以及这三个功能的组合。

准实时

es环境配置

  • 首先安装 Java jdk
    • JAVA_HOME
    • 配置环境变量path
  • 然后管理员身份运行bin目录下的bat文件安装es
  • 同上原理安装kibana
    • kibana 一个为es提供数据分析的web接口. 可使用它对日志进行高效的搜索, 可视化, 分析等操作(类似于mysql的客户端)
  • 注意: kibana和es, ik分词版本保持一致

es数据组织

对比关系型数据库(不完全正确,方便理解参考)
数据库	 ---	索引indices
表	  ----	类型types
行	 ----	文档documents
字段	----	字段fields
  • 逻辑设计
    • 文档: 索引和搜索数据的最小单位
    • 类型: 文档的逻辑容器(类似于关系型数据库中, 表格是行的容器)
    • 索引: 映射类型的容器, es中的索引是一个非常大的文档集合. 索引存储了映射类型的字段和其他设置, 然后将它们存储到了各个分片上
  • 物理设计
    • 节点
    • 创建一个索引, 默认产生5个主分片, 5个副分片 (对应的主副分片不会在同一台服务器上), 一个分片是一个Lucene索引 (21亿篇文档 / 2740亿个唯一词条)
    • 一个Lucene索引 == 一个包含倒排索引的文件目录
  • 倒排索引: 词条, 对勾, 匹配到的文档都返回, 但是按照匹配度排序
    • 在不全文搜索的情况下返回符合关键字的文档, 建议了解一下其算法
  • 参考博客: https://www.cnblogs.com/Neeo/articles/10571307.html

es基本操作

新增数据(JSON形式)
# PUT 索引名/类型/文档id
PUT a1/doc/1
{
  "name":"大郎",
  "age":18
}

# 更新,version变化
PUT a1/doc/1
{
  "name":"武大郎",
  "age":16
}

# 查找
GET a1/doc/1

# 查找doc目录下所有,是个字典套列表套字典...
GET a1/doc/_search

# 删除
# DELETE 索引名/类型/文档id
DELETE a1/doc/3

# 全部删除(删除a1索引)
DELETE a1/

# 修改部分数据
# POST 索引名/类型/文档id/_update
POST s22/doc/1/_update
{
	"doc": {
		"age": 27
	}
}
# PUT命令,在做修改操作时,如果未指定其他的属性,则按照指定的属性进行修改操作。所以修改不要用PUT

# 查询所有的索引
GET _cat/indices?v

es两种查询方式

#HEAD确认索引是否存在(200/404)
HEAD s22

查询年龄为18的数据
#简单搜索(查询字符串搜索)
GET s22/doc/_search?q=age:18

#DSL查询(重点)
GET s22/doc/_search
{
    "query":{
        "match":{
            "age":"18"
        }
    }
}

match系列

# match 先分析关键字, 分词, 然后搜索
GET s22/doc/_search
{
    "query":{
        "match":{
            "tag":"白 可爱"	#分词拆成"白" "可" "爱"
        }
    }
}

# match_phrase 短语查询
GET s22/doc/_search
{
    "query":{
        "match_phrase":{
            "tag":"可爱"	  #不拆分词
        }
    }
}

GET t1/doc/_search
{
    "query":{
        "title":{
            "query": "中国世界",
            "slop": 1		# 词之间的间隔
        }
    }
}


# match_all 查询所有
GET s22/doc/_search
{
    "query":{
        "match_all":{}
    }
}

今日内容

基础操作

排序 ( 先查后排 )

GET s22/doc/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [			#与query平级
    {
      "FIELD": {
        "order": "desc"  #字段 降序(asc升序)
      }
    }
  ]
}

不是所有字段都能排序

分页

GET s22/doc/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0,	#从第几条开始
  "size":2		#返回几条
}

bool查询

# 并且must
# 查询city是广州的,并且年龄25 (注意两个match的位置,must是个列表)
GET s22/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "city": "广州"
          }
        },
        {
          "match": {
            "age":25
          }
        }
      ]
    }
  }
}

# 或者should
# 查询city是广州的,或者年龄22
GET s22/doc/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "city": "广州"
          }
        },
        {
          "match": {
            "age": 22
          }
        }
      ]
    }
  }
}

# 非must_not
#查询city不是广州,年龄又不是29的
GET s22/doc/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "city": "广州"
          }
        },
        {
          "match": {
            "age":29
          }
        }
      ]
    }
  }
}

# 过滤filter  范围值
#查询city是广州,年龄大于23的
GET s22/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "city": "广州"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gt": 23,	#"gte"大于等于
            #"lte": 20
          }
        }
      }
    }
  }
}

# 查询city是广州,或者年龄小于等于28的
# should和filter一起用的时候,先走filter再走should
GET s22/doc/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "city": "广州"
          }
        },
      ],
      "filter": {
        "range": {
          "age": {
            "lte": 28
          }
        }
      }
    }
  }
}

# 总结:
must 与关系(相当于and)
should 或关系(相当于or)
must_not 非关系(相当于not)
filter 过滤条件
    range 条件筛选范围
    gt 大于
    gte 大于等于
    lt 小于
    lte 小于等于

对结果过滤 _source

# 查询city是广州,或者年龄小于等于28的,要求显示结果只保留city和age字段
GET s22/doc/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "city": "广州"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "lte": 28
          }
        }
      }
    }
  },
  "_source": ["city","age"]		#与query同级
}

高亮查询

#默认版的
GET s22/doc/_search
{
  "query": {
    "match": {
      "desc": "成熟"
    }
  },
  "_source": ["成熟"],
  "highlight": {	#高亮
    "fields": {		#指定字段
      "desc": {}
    }
  }
}

#自定义高亮显示
GET s22/doc/_search
{
  "query": {
    "match": {
      "desc": "成熟"
    }
  },
  "_source": ["成熟"],
  "highlight": {
    "pre_tags": "<b style='color:yellow;font-size:20px'>",	#标签的前半部分,可定制style
    "post_tags": "</b>", 	#标签的后半部分
    "fields": {			#字段
      "desc": {}
    }
  }
}

聚合函数

#查平均年龄
GET s22/doc/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "my_avg": {		#自己的起的别名
      "avg": {
        "field": "age"
      }
    }
  }
}

#查最大年龄()
GET s22/doc/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "my_avg": {
      "max": {		# "min"最小; "sum"求和
        "field": "age"
      }
    }
  },
  "from": 0,		# 只返回聚合数据,不用看其余详细数据
  "size": 0
}

分组查询

#先查后聚合
GET s22/doc/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "avg_group": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 15,		#左包右不包
            "to": 20
          },
          {
            "from": 20,
            "to": 25
          },
          {
            "from": 25,
            "to": 30
          }
        ]
      }
    }
  }
}
原文地址:https://www.cnblogs.com/straightup/p/13737578.html