1. 查看es的集群状态:
curl 'localhost:9200/_cat/health?v'
注释:?v表示格式化输出
2. 查看节点列表
curl 'localhost:9200/_cat/nodes?v'
3.查询所有索引及数据大小
curl 'localhost:9200/_cat/indices?v'
store.size为保存的所有数据大小,包含副本的数据;
pri.store.size为primary store size,即主分片的数据大小;
pri为分片个数,rep为副本个数。
store.size = pri.store.size * (rep + 1)
4.创建索引(名称为studentindex)并指定分片数和备份数
curl -XPUT 'http://localhost:9200/studentindex' -d'
{
"settings" : {
"index" : {
"number_of_shards" : 3,
"number_of_replicas" : 2
}
}
}'
5.创建索引studentindex,并添加类型student,并指定分词是studentname,分词器采用ik中文分词
curl -XPUT 'http://localhost:9200/studentindex' -d '
{
"settings":{
"analysis" : {
"analyzer" : {
"ik" : {
"tokenizer" : "ik_smart"
}
}
},
"number_of_shards":7,
"number_of_replicas":2
},
"mappings": {
"student": {
"properties": {
"studentId": {
"type": "keyword"
},
"studentname": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}
}
}'
说明:
在插入文档时,ES查看该字段有没有定义analyzer,如果定义了就用定义的,否则使用ES默认的;
在搜索文档时,ES会先去看字段有没有定义search_analyzer,如果没有定义,就去看有没有analyzer,再没有定义就使用否则使用ES默认的。
针对中文分词,一般创建index时指定analyzer = ik_max_word,search_analyzer = ik_smark。
历史经验:
如果关键词为:河南省二七纪念塔
使用ik_smart分词为:[河南省二七纪念塔,河南省,二七,纪念塔]
使用ik_max_word分词为:[河南省二七纪念塔,河南省,河南,河,南,省,二七,纪念塔,纪念,纪,念,塔]
如果指定analyzer = ik_smark,search_analyzer = ik_smark,那么搜索“河南”将搜索不到“河南省二七纪念塔”这条记录,因为分词里不包含“河南”这个词,只有搜索“河南省”搜索到。
keyword和text的区别:
text类型字段是基于文本的相关搜索,可以指定分词(如ik分词器),当指定分词后,可以在全文本字段上搜索单词(假如field="中华人民共和国",可以通过搜索"中华","共和国"等搜索到记录)。但是text类型不能,"analyzer" ="ik_max_word"够用于排序和聚合,否则提示illegal_argument_exception错误。
keyword类型字段在ES中不进行分词,也不支持指定分词器(如ik分词器),数据是完整保存的(field="中华人民共和国",可以通过搜索"中华","共和国"等搜索不到记录)。通常用于过滤,排序和聚合,适合保存枚举值,如男/女,公司类型等。
可以通过同一个字段拥有text和keyword两个版本,一个用于全文搜索,另一个用于聚合和排序,这样就同时满足二者的功能,但增加了存储空间。
另外修改type,analyzer需要重新导入数据,可以通过创建index别名来实现。
查询index的mappings和settings
curl -XGET 'http://localhost:9200/studentindex/_mappings'
curl -XGET 'http://localhost:9200/studentindex/_settings'
Elastic Search和mysql的对应关系
MySql | Elastic Search |
---|---|
database | index |
table | type |
row | document |
cloumn | field |
schema | mapping |
index | Everything is indexed |
SQL | query DSL |
slect * from... | get http://... |
update talbe set... | put http://... |
6.查询索引是studentindex,type是student,studentname字段的值是“李”的信息,默认返回第一页,10条数据
curl -XGET \
'http://localhost:9200/studentindex/student/_search?q=studentname:李
返回结果:
{
"took": 32,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 645161,
"max_score": 13.882782,
"hits": [{
"_index": "studentindex",
"_type": "student",
"_id": "AWNIsqEX4aqkPyNgQr06",
"_score": 13.882782,
"_source": {
"studentname": "李李四"
}
},
{
"_index": "studentindex",
"_type": "student",
"_id": "AWNIsqEX4aqkPyNgQr06",
"_score": 13.23425,
"_source": {
"studentname": "李五"
}
}
]
}
}
7.使用post查询elastic search
curl -X POST \
'http://localhost:9200/studentindex/student/_search' -d '{
"query": {
"match": {
"studentname": "李"
}
},
"from": 100, // 第几页开始
"size": 10 // 每页的大小
}'
返回结果同上:
注释:
在url中的q=* 相等于body中的
{
"query": { "match_all": {} }
}
精确查找的body为:
{
"size":10,
"query" : { "term" : { "studentname" : "李四" }}
}
跨字段搜索
{
"query": {
"multi_match": {
"query": "李四",
"type": "most_fields",
"fields": ["studentname", "studentId"]
}
}
}
多字段查询
{
"query": {
"bool": {
"should": [{
"match": {
"studentname": "李四"
}
},
{
"match": {
"studentId": "11232341"
}
}
]
}
}
}
权值搜索
{
"query": {
"bool": {
"should": [{
"match": {
"studentname": {
"query": "太平洋",
"boost": 2 // 权值默认是1
}
}
},
{
"match": {
"studentId": {
"query": "公司",
"boost": 1 // 权值默认是1
}
}
}
]
}
}
}
组合查询
{
"query": {
"bool": {
"should": { //至少有一个语句要匹配,与 OR 等价。
"match": {
"studentname": "太平洋"
}
},
"must_not": { //所有的语句都 不能(must not) 匹配,与 NOT 等价。
"match": {
"studentId": "A"
}
},
"must": { //所有的语句都 必须(must) 匹配,与 AND 等价。
"match": {
"studentname": "会议"
}
}
}
}
}
跨字段权值搜索,使用^操作符
{
"query": {
"multi_match": {
"query": "李四",
"type": "most_fields",
"fields": ["studentname^3", "studentId"]
}
}
}
排序,asc或者desc
{
"query": {
"multi_match": {
"query": "李四",
"type": "most_fields",
"fields": ["studentname", "studentId"]
}
},
"sort":{
"studentId":{ // studentId不能够是text类型的,否则报错
"order": "asc"
}
}
}
8.查询数据总数:
curl -XPOST 'http://localhost:9200/studentindex/student/_count'
9.插入数据
a. curl -XPOST 'localhost:9200/studentindex/student?pretty' -d'
{"studentname": "Jane Doe" }'
b.指定数据的Id是id1
curl -XPOST 'localhost:9200/studentindex/student/id1?pretty' -d'
{"studentname": "John Doe" }'
10 删除数据
a.删除studentindex中ID为2的数据
curl -XDELETE 'localhost:9200/studentindex/student/2?pretty'
b.根据条件删除数据
curl -XPOST 'localhost:9200/studentindex/student/_delete_by_query?pretty'
-d
'{
"query": {
"match": {
"studentname": "John"
}
}
}'
c.删除索引
curl -XDELETE 'localhost:9200/studentindex/student
11.修改数据的属性
修改id=1的studentname属性值部分更新
update 部分更新请求表单接受一个局部文档参数 doc ,它会合并到现有文档中的对象合并在一起,存在的标量字段被覆盖,新字段被添加。Elastic Search采用CAS乐观锁的方式实现更新数据。
curl -XPOST 'localhost:9200/studentindex/student/1/_update?pretty' -d ' {
"doc": {
"studentname": "xyd"
}
}'
修改id=1的studentname属性值-全量更新
1.从旧文档中检索文档;
2.修改它;
3.删除旧的文档;
4.索引新文档。
curl -XPOST 'localhost:9200/studentindex/student/1' -d ' {
"doc": {
"studentname": "xyd"
}
}'
12. 查看分词结果
curl -X POST http://localhost:9200/student/_analyze
-d '{
"analyzer":"ik_smart", // 分词器
"text" : "北京地铁有限公司"
}
'
13.查看elastic search版本信息
curl 'localhost:9200'
14.function_score查询
curl -X GET 'localhost:9200/student_search' -d '
{
"query": {
"function_score": {
"query": {.....}, //主查询,会得到一个old_score评分。
"field_value_factor": {...}, //在old_score的基础上,制定其他字段的评分,会产生一个加强score。
"boost_mode": "multiply", //指定用哪种方式结合old_score和加强score成为new_score
"max_boost": 5 //限制加强score的最高分
}
}
}
'
15.同义词查询
同义词配置:
定义同义词文件synonym.dic
土豆,洋芋,马铃薯
玉米,苞米,包谷,棒子
u s a,united states,united states of america => usa
g b,gb,great britain => britain,england,scotland,wales
定义索引格式
{
"settings": {
"analysis": {
"filter": {
"lance_synonym_filter": {
"type": "synonym",
"synonyms_path" : "synonym.dic"
}
},
"analyzer": {
"lance_synonyms": {
"tokenizer": "ik_smart",
"filter": [
"lance_synonym_filter"
]
}
}
}
}
}
使用举例:GET ***/_analyze?analyzer=lance_synonyms
16.filter和query的异同
filter仅仅过滤条件,不进行相关度的评分,所以score结果为0,而且ES内部实现了cache功能,自动cache;
query要进行相关度的评分,并按照相关度进行排序,query不支持cache。
参考资料:
《Elasticsearch: 权威指南》https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html