elasticsearch 的高级检索以及 Ik分词器的配置和使用

首先准备测试数据

这是测试数据 点击去获取
在这里插入图片描述

使用上一篇我们安装的 kibana 将他们批量插入到es中

POST /bank/account/_bulk在这里插入图片描述
数据插入成功之后可以在 psotman 调用 _cat/indices 接口查看所有索引 就可以看到刚才brank 以及1000条数据

http://192.168.10.220:9200/_cat/indices

在这里插入图片描述

下面我们正式开始 进阶检索

SearchApi
支持 两种基本方式检索:

  1. 通过使用 REST request URI 发送搜索参数(uri+检索参数)
  2. 通过使用 REST request body 发送(uri+请求体)
第一种
GET bank/_search?q=*&sort=account_number:asc
q=* --查询全部
sort=account_number:asc --排序按照account_number 升序排列

在这里插入图片描述

第二种 Query DSL
GET bank/_search
{
"query":{
     "match_all":{}
	},
"sort":[
	{
	"account_number":"asc" //先按照account_number 升序排序
	},
	{
	"balance":"desc" //如果账户一样时再使用 balance 降序排序
	}
	]
}
//这里就不贴运行结果了  都是查询的全部和上面的结果是一样的

主要语法结构参考 官方学习文档

match 【匹配查询】
基本类型非字符串,精确匹配(匹配字段是 字符串时为模糊匹配)

//匹配账号是20的
GET bank/_search
{
  "query": {
    "match": {
      "account_number": "20"//使用数字也是没问题的 
    }
  }
}

在这里插入图片描述

// 如果匹配值是字符串时就是 模糊匹配
GET bank/_search
{
  "query": {
    "match": {
      "address": "kings"
    }
  }
}

在这里插入图片描述

全文检索 按照评分进行排序,会对检索条件进行分词匹配

match_phrase 【短语匹配】(不进行分词)

GET /bank/_search
{
  "query": { "match_phrase": { "address": "mill lane" } }
}

在这里插入图片描述

multi_match 【多字段匹配】

## 多字段匹配  address或者 city 中任何一个 属性包含 mill movico中一个都算命中 会分词
GET /bank/_search
{
  "query": {
    "multi_match": {
      "query": "mill movico",
      "fields": ["address","city"]
    }
  }
}

在这里插入图片描述

bool 查询

## bool 查询
GET /bank/_search
{
  "query": {
   "bool": {
     "must": [ //必须满足
       {"match": {
         "gender": "m"
       }},
       {
         "match": {
           "address": "mill"
         }
       }
     ],
     "must_not": [//必须 age不是18的
       {"match": {
         "age": "18"
       }}
     ],
     "should": [ //should 能匹配到更好 匹配不到也无所谓  匹配到会加命中分 得分会更高
       {"match": {
         "lastname": "Wallace"
       }}
     ]
   }
  }
}

在这里插入图片描述

filter 过滤 【不贡献 相关性得分】但是可以之前的哪些条件组合使用

GET /bank/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "age": {
            "gte": 18,
            "lte": 30
          }
        }
      }
    }
  }
}

在这里插入图片描述

term 查询 【非文本字段 推荐使用 】

GET /bank/_search
{
  "query": {
    "term": {
      "age": "20"
    }
  }
}

全文 处理

//只匹配address 值为kings
GET bank/_search
{
  "query": {
    "match": {
      "address.keyword": "kings"
    }
  }
}
// 会分词 address  包含 kings
GET bank/_search
{
  "query": {
    "match_phrase": {
      "address": "kings"
    }
  }
}

aggregations 【聚合 同时支持 子聚合】

GET /bank/_search
{
 "query": {
   "match": {
     "address": "mill"
   }
 } ,
 "aggs": {
   "ageAgg": { //年龄分布
     "terms": {"field": "age",
       "size": 10
     }
   },
   "ageAvg":{//平均年龄
    "avg": {
      "field": "age"
    }
     
   },
   "balanceAvg":{ //平均工资
     "avg": {
       "field": "balance"
     }
   }
 },
 "size": 0 //只看分析数据不看返回数据时设置为 0
 }

在这里插入图片描述

// 子聚合分析
GET /bank/_search
{
 "query": {
   "match_all": {
   }
 } ,
 "aggs": {
   "ageAgg": {
     "terms": {"field": "age", //首先分年龄
       "size": 100
     },
     "aggs": {
       "genderAgg": {
         "terms": {
           "field": "gender.keyword",//在分析各个年龄的男女占比
           "size": 10
         },
         "aggs": {
           "blanceAvg": {
             "avg": {
               "field": "balance" //再分析 男女占比的薪资平均值
             }
           }
         }
       }
     }
   }
 },
 "size": 0
 }

在这里插入图片描述
主要语法聚合还需参考 aggregations 官方文档

【Mapping】

第一次保存数据时 会自动识别

GET /bank/_mapping  查看映射

在这里插入图片描述

可以定义 索引的映射关系

在这里插入图片描述

//6.0 版本后 不建议使用在索引后指定type

//创建新的的索引因映射
PUT /my-index
{
  "mappings": {
    "properties": {
      "age":    { "type": "integer" },  
      "email":  { "type": "keyword"  }, 
      "name":   { "type": "text"  }     
    }
  }
}
//映射添加新字段
PUT /my-index/_mapping{
  "properties": {
    "employee-id": {
      "type": "keyword",
      "index": false //不需要被索引  这个属性默认时true
    }
  }
}
//更新映射只能做数据迁移(创建新的索引映射)
POST _reindex //新版本没有type时这样迁移
{
  "source": {
    "index": "twitter" //old index 
  },
  "dest": {
    "index": "new_twitter" //new index
  }
}
//旧版本有type时
POST _reindex //新版本没有type时这样迁移
{
  "source": {
    "index": "twitter", //old index 
    "type":"account"//旧type
  },
  "dest": {
    "index": "new_twitter" //new index
  }
}

【分词】

一个tokenizer(分词器)接收一个字符流,将之分割为独立的tokens(词元,通常是独立的单词),然后输出tokens流。
例如:whitespace tokenizer遇到空白字符时分割文本。它会将文本“Quick brown fox!”分割为[Quick,brown,fox!]。
该tokenizer(分词器)还负责记录各个terms(词条)的顺序或position位置(用于phrase短语和word proximity词近邻查询),以及term(词条)所代表的原始word(单词)的start(起始)和end(结束)的character offsets(字符串偏移量)(用于高亮显示搜索的内容)。
elasticsearch提供了很多内置的分词器,可以用来构建custom analyzers(自定义分词器)。

//默认的标准分词器
POST _analyze
{
  "analyzer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

安装 IK分词器 进入到elasticsearch 的安装目录 plugins 上一篇安装时我们 挂在了这个数据卷 在主机

# 进入挂载的插件目录 /mydata/elasticsearch/plugins
cd /mydata/elasticsearch/plugins

# 下载对应版本的 IK 分词器(这里是7.4.2)
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip

下载完成后解压

//在/mydata/elasticsearch/plugins 创建 IK文件夹
mkdir ik
//解压到ik文件下
unzip -d ik elasticsearch-analysis-ik-7.4.2.zip
//设置权限为可读可写
chmod -R 777 ik/

重启elasticsearch 容器进行测试

POST _analyze
{
  "analyzer": "ik_max_word",
  "text":"文档记录项目"
}

在这里插入图片描述

自定义词库(对于一些网络热词以及其他的词源无法达到理想状态)

//在  nginx安装目录中进入
cd /nginx/html
//创建文件夹 es
mkdir es
//创建 文件 (输入词)乔碧罗
vi fenci.txt
//最后来到刚才安装的ik分词器的目录下
cd /mydata/elasticsearch/plugins/ik/config
//然后编辑打开 远程词库 配置上面的地址 http://192.168.10.220/es/fenci.txt
vi IKAnalyzer.cfg.xml

重启 elasticsearch 容器docker restart elasticsearch

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值