创建索引:
put /索引名称?pretty
查询索引:
get _cat/indices?v
删除索引:
delete /index_name?pretty
PUT /index/_doc/id
{
Json数据
}
示例数据:
PUT /product/_doc/1
{
"name" : "xiaomi phone",
"desc" : "shouji zhong de zhandouji",
"price" : 3999,
"tags": [ "xingjiabi", "fashao", "buka" ]
}
全量更新:使用put关键字,和插入数据格式相同,会完全替换掉原始数据(某些字段不传,就更新成空了)
更新字段:
post /索引名称/_doc/id/_uodate
POST /product/_doc/1/_update
{
"doc": {
"price": 2999
}
}
查询所有
方式一:
get /product/_doc/_search
方式二:
get /product/_search
{
"query": {
"match_all": {}
}
}
根据id查询
GET /product/_doc/1
分页:
get /product/_search from=0&size=2
match_all:匹配所有
GET /product/_search
{
"query":{
"match_all": {}
}
}
match:name 中包含“nfc”
GET /product/_search
{
"query": {
"match": {
"name": "nfc"
}
}
}
sort 排序
多字段查询。
query:要查询的字符串
fields:要查询的字段
GET /product/_search
{
"query": {
"multi_match": {
"query": "nfc",
"fields": ["name","desc"]
}
},
"sort": [
{
"price": "desc"
}
]
}
_source 元数据:想要查询的多个字段,例子中只查询“name”
GET /product/_search
{
"query":{
"match": {
"name": "nfc"
}
},
"_source": ["name"]
}
分页
GET /product/_search
{
"query":{
"match_all": {}
},
"sort": [
{
"price": "asc"
}
],
"from": 0,
"size": 2
}
phrase search:短语搜索(match_phrase的分词结果必须在被检索字段的分词中都包含,而且顺序必须相同,默认必须都是连续的)
GET /product/_search
{
"query": {
"match_phrase": {
"name": "nfc phone"
}
}
}
query-term : 不会被分词
GET /product/_search
{
"query": {
"term": {
这里nfc phone 是作为一个整体的,不会进行分词的查找
"name": "nfc phone"
}
}
}
match 和terms 区别
term:代表的完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词拆解。只能查单个单词。
terms:匹配多个词,[]中的多个词是或者的关系,只要满足一个次就可以。
match:match搜索的时候,会先进行分词的拆分,拆完完,再来匹配,属于或的关系,只要有一个词能匹配到,就行。
//match 匹配一个分词就行;
//terms是书写的整体作为查找条件。
库里是按照单个分词存储的
GET /product/_search
{
"query": {
"bool": {
//要满足两个词
"must": [
{"term":{"name":"nfc"}},
{"term":{"name":"phone"}}
]
}
}
}
GET /product/_search
{
"query": {
"terms": {
"name":["nfc","phone"]
}
}
}
bool:可以组合多个查询条件,bool查询也采用more_matches_is_better的机制,因此满足must和should的子句的文档将会合起来并计算分值
案例:
GET /product/_search
{
"query": {
"bool":{
#name中必须不能包含“erji”
"must": [
{"match": { "name": "xiaomi"}}
],
#name中必须包含“xiaomi”
"must_not": [
{"match": { "name": "erji"}}
],
#可能满足 desc字段包含nfc
"should": [
{"match": {
"desc": "nfc"
}}
],
#筛选价格大于4999的doc
"filter": [
#这种可以理解为模板二级位置要放的东西,和上面的match一个意思
{"range": {
"price": {
"gt": 4999
}
}}
]
}
}
}
搜索一台xiaomi nfc phone或者一台满足 是一台手机 并且 价格小于等于2999。
constant_score 不再计算得分排序了,所有的得分都是一样的。
GET /product/_search
{
"query": {
"constant_score": {
"filter": {
"bool":{
"should":[
{"match_phrase":{"name":"xiaomi nfc phone"}},
{
"bool":{
"must":[
{"term":{"name":"phone"}},
{"range":{"price":{"lte":"2999"}}}
]
}
}
]
}
}
}
}
}
是否对创建对当前字段创建索引,默认true,如果不创建索引,该字段不会通过索引被搜索到,但是仍然会在source元数据中展示
指定分析器
对当前字段相关度评分权重,默认1
是否运行强制类型转换。true 。
我们把 city, country 及 province 三个项合并成为一个项 region,但是这个 region 并不存在于我们文档的 source 里。当我们这么定义我们的 mapping 的话,在文档被索引之后,有一个新的 region 项可以供我们进行搜索
"city": {
"type": "keyword",
"copy_to": "region"
},
"country": {
"type": "keyword",
"copy_to": "region"
},
"province": {
"type": "keyword",
"copy_to": "region"
},
"region": {
"type": "text"
假如我们想搜索 country:中国,province:北京 这样的记录的话,我们可以只写如下的一条语句就可以了
GET twitter/_search
{
"query": {
"match": {
"region": {
"query": "中国 北京",
"minimum_should_match": 4
}
}
}
}
为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序和聚合,也不需要通过脚本访问值,可以禁用doc值以节省磁盘空间
控制是否可以动态添加新字段(在插入消息的时候)。
不应该用于冻结的索引,对于一个冻结索引,全局序数在每次搜索时重建后被丢弃,当请求它们时重新构建,这导致在每次搜索时重新加载全局序数。用于聚合的字段上,优化聚合性能(冻结索引)
是否创建倒排索引,可以对字段操作,也可以对索引操作,
…