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
}
]
}
}
}
}