首先准备测试数据
这是测试数据 点击去获取
使用上一篇我们安装的 kibana 将他们批量插入到es中
POST /bank/account/_bulk 数据插入成功之后可以在 psotman 调用 _cat/indices 接口查看所有索引 就可以看到刚才brank 以及1000条数据
http://192.168.10.220:9200/_cat/indices
下面我们正式开始 进阶检索
SearchApi 支持 两种基本方式检索:
- 通过使用 REST request URI 发送搜索参数(uri+检索参数)
- 通过使用 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"
},
{
"balance":"desc"
}
]
}
主要语法结构参考 官方学习文档
match 【匹配查询】 基本类型非字符串,精确匹配(匹配字段是 字符串时为模糊匹配)
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": [
{"match": {
"age": "18"
}}
],
"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"
}
}
}
全文 处理
GET bank/_search
{
"query": {
"match": {
"address.keyword": "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
}
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 查看映射
可以定义 索引的映射关系
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
}
}
}
POST _reindex
{
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter"
}
}
POST _reindex
{
"source": {
"index": "twitter",
"type":"account"
},
"dest": {
"index": "new_twitter"
}
}
【分词】
一个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
下载完成后解压
mkdir ik
unzip -d ik elasticsearch-analysis-ik-7.4.2.zip
chmod -R 777 ik/
重启elasticsearch 容器进行测试
POST _analyze
{
"analyzer": "ik_max_word",
"text":"文档记录项目"
}
自定义词库(对于一些网络热词以及其他的词源无法达到理想状态)
cd /nginx/html
mkdir es
vi fenci.txt
cd /mydata/elasticsearch/plugins/ik/config
vi IKAnalyzer.cfg.xml
重启 elasticsearch 容器docker restart elasticsearch
|