ElasticSearch - CURD

//简单查看健康状态
GET 192.168.1.91:9200/_cat/health?v
//查看有那些索引
GET 192.168.1.91:9200/_cat/indices?v
//ik分词器
下载ik分词器https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.10.1/elasticsearch-analysis-ik-7.10.1.zip
切换用户 su ElasticSearch
在/usr/local/elasticsearch/plugins新建目录ik
在/usr/local/elasticsearch/plugins/ik下解压ik分词器
重启es

//自定义生僻词匹配, 比如"网红"
新建文件夹 /usr/local/elasticsearch/plugins/ik/config/custom
新建文件 /usr/local/elasticsearch/plugins/ik/config/custom/mydict.dic
在mydict.dic里每行加入一个自定义匹配词
在/usr/local/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict">/custom/mydict.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

//建立一个索引,可以携带body也可以不携带body,ik_max_wrod,iksmart中文分词器
PUT 192.168.1.91:9200/test_index?pretty
{
    "settings":{
        "number_of_shards":1,
        "number_of_replicas":0
    },
    "mappings":{
        "properties":{
            "my_field":{
                "type":"text"
            },
            "title":{
            "type":"text",
            "analyzer":"ik_max_word",
	        },
	        "content":{
	            "type":"text",
	            "analyzer":"ik_max_word"
	        }
        }
    }
}
//建立索引时指定dynamic, 可以指定true代表有新增字段就新增, false代表有新增字段就忽略, strict代表有新增字段就报错
{
    "mappings":{
        "dynamic":"strict",
        "properties":{
            "title":{
                "type":"keyword"
            }
        }
    },
    "settings":{
        "analysis":{
        "analyzer":{
            "es_std":{
                "type":"standard",
                "stopwords":"_english_"
            }
        }
     }
    }
}

//修改索引副本数量
192.168.1.91:9200/test_create_mapping/_settings
{
    "number_of_replicas":1
}

//删除索引
DELETE 192.168.1.91:9200/test_index
//PUT 方法向索引中插入数据必须指定ID
PUT 192.168.1.91:9200/students/_doc/1
{
	"name":"xxx",
	"age":"xx"
}
//POST 方法向索引插入数据则不用指定id, 系统随机生成
POST 192.168.1.91:9200/students/_doc/
{
	"name":"xxx",
	"age":"xx"
}
//查询文档, 指定文档id
GET 192.168.1.91:9200/students/_doc/1
//查询文档, 指定多个id
POST 192.168.1.91:9200/students/_mget
{
    "ids":[
        "rI_M4nYBoiFM3OPwnsfR",
        "rY_15HYBoiFM3OPw68cz",
        "ro8E5XYBoiFM3OPwDMea"
    ]
}
//查询所有文档
GET 192.168.1.91:9200/students/_search
POST 192.168.1.91:9200/students/_search
{
    "query":{"match_all":{}}
}
//multi_match匹配
POST 192.168.1.91:9200/students/_search
{
   "query":{
       "multi_match":{
           "query":"Jon",
           "fields":["name", "hoppy"]
       }
   }
}

//term查询不对关键词分词, 用于匹配不被分词的字段,也就是正排索引
POST 192.168.1.91:9200/students/_search
{
   "query":{
       "term":{"name":"Jon Stand"}
   }
}
//tersm 一个字段查询两个搜索词, 
{
   "query":{
       "terms":{"name":["Jon", "xiaohua"]}
   }
}
//terms适合查询不分词的字段, 字段自带keyword 265个字符不分词
POST 192.168.1.91:9200/students/_search
{
    "query":{
        "term":{
            "name.keyword":"Lingos Dan"
        }
    }
}

//直接filter
POST 192.168.1.91:9200/students/_search
{
   "query":{
       "constant_score":{
           "filter":{
               "range":{
                   "age":{
                       "gt":5
                   }
               }
           }
       }
   }
}
//直接range
POST 192.168.1.91:9200/students/_search
{
   "query":{
       "range":{
           "age":{
               "gt":5
           }
       }
   }
}

//match先对搜索词分词,匹配分词之后的倒排索引,sort排序, from,size分页, source指定返回字段类似mysql select, highlight指明高亮字段
POST 192.168.1.91:9200/students/_search
{
    "query":{
        "match":{
            "name": "Jon"
        }
    },
    "sort":{"age":"asc"},
    "from":0,
    "size":2,
    "_source":["hoppy","name"],
    "highlight":{
        "fields":{
            "name":{}
        }
    }
}
//指定match的精准度, boost可以提高分数排名.
POST 192.168.1.91:9200/students/_search
{
    "query":{
        "match":{
            "name":{
                "query":"Jon Stand",
                "minimum_should_match":"50%",
                "boost": 2
            }
        }
    }
}
//dis_max 实现best_field策略, 取单个单个字段最高分,单个字段匹配最多关键词, tie_breaker 指定其他字段参与分数运算,其他字段的得分乘以tie_breaker的值加到总分数
POST 192.168.1.91:9200/students/_search
{
    "query":{
       "dis_max":{
           "queries":[
               {"match":{"name":"Jon Stand"}},
               {"match":{"hoppy":"eat drink play happy"}}
           ],
           "tie_breaker":0.3
       }
    }
}

// most_field策略.
POST 192.168.1.91:9200/students/_search
{
    "query":{
       "multi_match":{
           "query": "Jon Stand eat",
           "type":"most_fields",
           "fields":["name","hoppy"]
       }
    }
}
// cross_field策略
POST 192.168.1.91:9200/students/_search
{
    "query":{
       "multi_match":{
           "query": "Jon Stand eat",
           "type":"cross_fields",
           "fields":["name","hoppy"]
       }
    }
}

//先去倒排匹配Jon, 然后匹配Stand, 并且确认两个词是相邻的, 如果需要匹配跳跃的两个词,sloop可以指定相隔几个词
POST 192.168.1.91:9200/students/_search
{
    "query":{
        "match_phrase":{
            "name":{
                "query": "Jon Stand",
                "slop": 3
            }
        }
    }
}

//前缀搜索 prefix
POST 192.168.1.91:9200/students/_search
{
    "query":{
        "prefix":{
            "name.keyword":{
                "value": "J"
            }
        }
    }
}
//模糊查询, 比如搜索"我是谁"写成了"我是水"
{
    "query":{
        "fuzzy":{
            "name":{
                "value":"jon",
                "fuzziness": 1
            }
        }
    }
}

//bool查询 minimum_should_match 代表should条件里至少匹配几条,如果指定1条,则should条件里至少有一条, must 满足条件, 而should没有匹配到至少一条,此文档依然当做不匹配
POST 192.168.1.91:9200/students/_search
{
   "query":{
       "bool":{
           "must":[
               {
                   "match":{"name":"Jon"}
               },
               {
                   "match":{
                       "age": 15
                   }
               }
            ],
            "should":[
                {
                    "match":{
                        "hoppy":"eat"
                    }
                },
                {
                    "match":{
                        "hoppy": "sleep"
                    }
                }
            ],
            "must_not":[
                {
                    "match":{"hoppy":"drink"}
                }
            ],
            "minimum_should_match": 1
       }
   }
}

//加入filter过滤查询
POST 192.168.1.91:9200/students/_search
{
    "query":{
        "bool":{
            "must":{
                "match":{
                    "name": "Jon"
                }
            },
            "filter":{
                "range":{
                    "age":{
                        "gt": 10
                    }
                }
            }
        }      
    }
}

//先查询数据, 再对数据聚合查询,按age分组, 每组有多少人, 
//aggs代表聚合, size:0表示不返回匹配到的用于分析的原始数据,
//group_by_age代表给分组起的名字, terms代表分组操作, 分组的字段属性fielddata必须为true
//aggs里可以嵌套aggs对分组后的数据再进行运算, 
//avg_age是给嵌套聚合起的名字, avg代表求分组里某个字段的平均值
//order代表用聚合之后每一组的统计信息排序, 这里是每一组的age平均值对组进行排序
POST 192.168.1.91:9200/students/_search
{
 "query":{
     "match_all":{}
 },
 "aggs":{
     "group_by_age":{
         "terms":{
             "field":"age",
             "order":{
                 "avg_age":"desc"
             }
         },
         "aggs":{
             "avg_age":{
                 "avg":{
                     "field":"age"
                 }
             }
         }
     }
 },
 "size":0
}


//修改字段属性, 属性改为fielddata之后会在该字段增加正排索引
POST 192.168.1.91:9200/students/_mapping
{
    "properties":{
        "name":{
            "type":"text",
            "fielddata":true
        }
    }
}

//多次聚合运算
POST 192.168.1.91:9200/students/_search
{
    "query":{"match_all":{}},
    "aggs":{
        "group_by_age":{
            "terms":{
                "field":"age"
            },
            "aggs":{
             "rang_age":{
                 "range":{
                    "field":"age",
                 "ranges":[
                     {
                        "from":0,
                        "to":10
                    },
                    {
                        "from":10,
                        "to":20
                    },
                    {
                        "from":20,
                        "to":30
                    }
                 ]   
                }, 
                "aggs":{
                    "age_avg":{
                        "avg":{
                            "field":"age"
                        }
                    }
                }
              }
            }
        }
    }    
 }

//PUT更新数据,更新整个文档
PUT 192.168.1.91:9200/students/_doc/1
{
	"name":"xxx",
	"age": "xx"
}
//POST只更新某个字段
POST 192.168.1.91:9200/students/_update/1
{
    "doc":{
        "age":"xx"
    }
}
//删除文档
DELETE 192.168.1.91:9200/students/_doc/1
//查看mapping
GET 192.168.1.91:9200/students/_mapping

//常用分词器
//分词器 对exact value 和 full text分别对待
//exact value 在建立索引和搜索关键词的时候都不分词
//full text 在建立索引和所搜关键词的时候都分词
//例句
"Set the shape to semi-transparent by calling set_trans(5)"
standard analyzer: set, the, shape, to, semi, transparent, by, calling, set_trans, 5
simple analyzer: set, the, shape, to, semi, transparent, by calling, set, trans
whitespace analyzer: Set, the, shape, to, semi-transparent, by, calling, set_trans(5)
language analyzer:特定语言分词器
//测试分词器
POST 192.168.1.91:9200/_analyze
{
    "analyzer":"standard",
    "text":"wang dong liang"
}

//mapping 常见类型 long, double, date, text, boolean,keyword
//keyword, date, boolean, long ,double类型都不会进行分词
//先创website索引建索引再创建mapping, field类型一但创建不可修改
PUT 192.168.1.91:9200/website?pretty
POST 192.168.1.91:9200/website/_mapping
{
    "properties": {
        "content": {
            "type":"text",
            "analyzer":"english"
        },
        "post_date":{
            "type":"date"
        },
        "overview":{
            "type":"long"
        },
        "price":{
            "type":"double"
        },
        "is_on_sale":{
            "type":"boolean",
            "index":"false"
        }
    }
}
//一个字段指定两种类型
POST 192.168.1.91:9200/students/_mapping
{
    "properties":{
        "where_going":{
            "type":"text",
            "fields":{
                "raw":{
                    "type":"keyword",
                    "index":false
                }
            },
            "fielddata"
        }
    }
}
//配置一个es内建分析器,修改其行为, 新建index的时候才能指定,
PUT 192.168.1.91:9200/website3
"settings": {
    "analysis": {
      "analyzer": {
        "std_english": { 
          "type":      "standard",
          "stopwords": "_english_"
        }
      }
    }
  },
  //自定义analyzer
PUT 192.168.1.91:9200/website3
{
    "settings":{
        "analysis":{
            "char_filter":{
                "&_to_and":{
                    "type":"mapping",
                    "mappings":["& => and"]
                }
            },
            "filter":{
                "my_stopwords":{
                    "type":"stop",
                    "stopwords":["the", "a"]
                }
            },
            "analyzer":{
                "my_analyzer":{
                    "type":"custom",
                    "char_filter":["html_strip", "&_to_and"],
                    "filter":["lowercase", "my_stopwords"],
                    "tokenizer":"standard"
                }
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值