ElasticSearch常用总结

Posted by 麦子 on Thursday, 2021年10月28日

笔记记录


GET books/_mapping


DELETE books
 

# 如何动态进行 mapper的修改
PUT books
{
	"mappings": {
			"properties": {
				"title": {
					"type": "text"
				},
				"publish_date": {
					"type": "date"
				},
				"name": {
					"type": "text"
				}
			}
		 
	}
}


#新增 mapper 字段
PUT books/_mapping
{
  "properties":{
    "price":{
      "type":"integer"
    }
    
  }
}


#为新增的mapper字段初始化值
POST books/_update_by_query
{
  "query": {
    "match_all": {}
  },
  "script": {
    "source": "if (ctx._source.price == null){ctx._source.price = 0}",
    "lang": "painless"
  }
}

GET books/_search


# 一共多少数量 
GET yuqing_new/_count 


# 比较这三个分词器的区别
POST _analyze
{
  "tokenizer": "ik_max_word", 
  "text": ["龙珠新转"]
  
}

POST _analyze
{
  "tokenizer":"ik_smart",
  "text":["龙珠新转"]
}


POST _analyze
{
  "tokenizer": "standard", 
  "text":["龙珠新转"]
}


 

PUT books/_doc/1
{
  "title":"葫芦娃",
  "name":"国产动漫,葫芦娃",
  "actor":"80后",
  "price":80,
  "publish_date":"1980-09-07"
}


PUT books/_doc/2
{
  "title":"灵笼",
  "name":"国产动漫",
  "actor":"90后, 00后",
  "price":180,
  "publish_date":"2021-09-07"
}


PUT books/_doc/3
{
  "title":"一人之下",
  "name":"国产动漫",
  "actor":"90后",
  "price":90,
  "publish_date":"2021-09-17",
  "starring":"冯宝宝"
}


PUT books/_doc/4
{
  "title":"进击的巨人",
  "name":"国外动漫",
  "actor":"30岁,20岁,10多岁",
  "price":200,
  "publish_date":"2020-09-07"
}


PUT books/_doc/5
{
  "title":"七龙珠",
  "name":"国外动漫",
  "actor":"30岁",
  "price":100,
  "publish_date":"2010-09-07"
}


PUT books/_doc/6
{
  "title":"悟空转",
  "name":"龙珠新转",
  "actor":"正在筹备中",
  "price":0,
  "publish_date":"2022-09-07"
}


GET books/_search



# match
# operator: or 就是query中选中一个就可以  operator:and 全部要匹配才可以出来
GET books/_search
{
  "query": {
    "match": {
      "title": {
        "query": "巨人七龙珠",
        "operator": "or"  
      }
    }
  }
}


# match_phrase, 查询短语,以一个短词作为一个整体来查询, 如下以  巨人  为一个整体来查询 
GET books/_search
{
  "query": {
    "match_phrase": {
      "title": "巨人"
    }
  }
}


# match_phrase_prefix, 这个不明白。
GET books/_search
{
  "query": {
    "match_phrase_prefix": {
      "title": "葫芦娃七"
    }
  }
}




# multi_match  多个条件的查询,查询多个字段中,有这个字的。
GET books/_search
{
  "query": {
    "multi_match": {
      "query": "龙",
      "fields": ["title","name"]
    }
  }
}


# multi_match  通配符处理
GET books/_search
{
  "query": {
    "multi_match": {
      "query": "龙",
      "fields": ["title","*name"]
    }
  }
}


# multi_match  指定关键词出现在 title 中的权重是出现在 description 字段中的 3 倍
GET books/_search
{
  "query": {
    "multi_match": {
      "query": "龙",
      "fields": ["title^3","name"]
    }
  }
}



#common_terms query, 
#主要作用:它把 query 分词后的词项分成重要词项(低频词项)和不重要的词项(高频词,也就是之前的停用词)
# 在搜索的时候,首先搜索和重要词项匹配的文档,这些文档是词项出现较少并且词项对其评分影响较大的文档。然后执行第二次查询,搜索对评分影响较小的高频词项,但是不计算所有文档的评分,而是只计算第一次查询已经匹配的文档得分。如果一个查询中只包含高频词,那么会通过 and 连接符执行一个单独的查询,换言之,会搜索所有的词项。

# 感觉针对一些大量的常用的, 不重要的词汇来进行,这样的效率会高很多。
# 具体看 https://www.knowledgedict.com/tutorial/elasticsearch-query.html#common_terms%20query 提高查询速度。
# 此段要做细进行说明。
GET books/_search
{
  "query": {
    "common": {
      "title": {
        "query": "人",
        "cutoff_frequency": 0.001,
         "low_freq_operator":"and"
      }
    }
  }
}


#词项查询

# 说明: 
#  1. 避免 term 查询对 text 字段使用查询。
#  2. 默认情况下,Elasticsearch 针对 text 字段的值进行解析分词,这会使查找 text 字段值的精确匹配变得困难。
#  3. 要搜索 text 字段值,需改用 match 查询。
#  4. 应用场景为查询人名、地名等需要精准匹配的需求

GET books/_search

GET books/_mapping


PUT books/_mapping
{
  "properties":{
    "actor":{
      "type":"keyword"
    }
    
  }
}

# 精确匹配操作, 
GET books/_search
{
  "query": {
    "term": {
      "actor": {
        "value": "90后"
      }
    }
  }
}



# 这个搜索不到, 因为默认分词只有 葫  芦  娃,三个中文字,然后又是text类型,所以用term精准查找葫芦娃,找不到
GET books/_search
{
  "query": {
    "term": {
      "title": {
        "value": "葫芦娃"
      }
    }
  }
}


POST _analyze
{
  "tokenizer": "standard", 
  "text":["葫芦娃"]
}


# match_phrase是分词匹配 ,而且必须连续   默认中文分字了  你用这个搜索条件就变成  三个字  而且必须连续  就能搜出 葫芦娃
GET books/_search
{
  "query": {
    "match_phrase": {
      "title": "葫芦娃"
    }
  }
}


GET books/_search


GET books/_search
{
  "query": {
    "terms": {
      "title": [
        "笼",
        "人"
      ]
    }
  }
}


#range query
# 1. gt 大于,查询范围的最小值,也就是下界,但是不包含临界值。
# 2. gte 大于等于,和 gt 的区别在于包含临界值。
# 3. lt 小于,查询范围的最大值,也就是上界,但是不包含临界值。
# 4. lte 小于等于,和 lt 的区别在于包含临界值。
GET books/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 80,
        "lte": 150
      }
    }
  }
}


GET books/_search
{
  "query": {
    "range": {
      "publish_date": {
        "gte": "1980-01-02",
        "lte": "2010-10-01",
        "format": "yyyy-MM-dd"
      }
    }
  }
}


#新增 mapper 字段
PUT books/_mapping
{
  "properties":{
    "starring":{
      "type":"keyword"
    }
  }
}



#  exists 查询会返回字段中至少有一个非空值的文档。用于判断这个属性是否有值

#  如:我这所有数据中,只有一个 starring有值, 那么他就返回回来了。 
GET books/_search
{
  "query": {
    "exists": {
      "field": "starring"
    }
  }
}


# 已什么开头,进行查询
GET books/_search
{
  "query": {
    "prefix": {
      "title": {
        "value": "人"
      }
    }
  }
}


#正则表达式查询 

# 中文译为通配符查询,支持单字符通配符和多字符通配符,? 用来匹配一个任意字符,* 用来匹配零个或者多个字符。
# 和 prefix 查询一样,wildcard 查询的查询性能也不是很高,需要消耗较多的 CPU 资源。

GET books/_search
{
  "query": {
    "wildcard": {
      "actor": {
        "value": "*后"
      }
    }
  }
}

# wildcard, regexp 处于正则表达式 

GET books/_mapping



# 根据id查询,像查数据库的组件一样
GET books/_search
{
  "query": {
    "ids": {
       "values": ["1","2"]
    }
  }
}



#复合查询 

# 复合查询就是把一些简单查询组合在一起实现更复杂的查询需求,除此之外,复合查询还可以控制另外一个查询的行为。

# bool 查询可以把任意多个简单查询组合在一起,使用 must、should、must_not、filter 选项来表示简单查询之间的逻辑,每个选项都可以出现 0 次到多次。

GET books/_search
{
 "query": {
   "bool": {
     "must": [
       {
        "match": {
          "name": "国产"
        }
       }
     ],
     "filter": [
       {
        "range": {
          "price": {
            "gte": 60,
            "lte": 100
          }
        }
       }
     ],
     "must_not": [
       {
         "match": {
           "title": "龙"
         }
       }
     ]
   }
 }
}


# boosting query  所谓的查询评分是啥? 另外进行学习处理。 
# constant_score query 
# dis_max query 

# es中是否有相识度的问题。 
GET yuqing_new/_count




# 嵌套查询

# 主要针对,继承关系的数量 


# nested query
# has_child query
# has_parent query




#特殊查询

#script query
GET books/_search
{
  "query": {
    "script": {
      "script": "doc['price'].value > 100"
    }
  }
}


# percolate query  需要熟悉这个

GET books/_search



# 位置查询后期在补上去  





# 大结: 高亮处理

# 自定义高亮 , 默认是 em标签,但是我们可以设置HTML标签的
GET books/_search
{
  "query": {
    "match": {
      "title": "葫芦娃"
    }
  },
  "highlight": {
    "fields": {
      "title": {
        "pre_tags": "<strong>",
        "post_tags": "<strong>"
      }
    }
  }
}


# 多字段高亮
GET books/_search
{
  "query": {
    "match": {
      "title": "葫芦娃"
    }
  }, 
  "highlight": {
    "require_field_match": "false", 
    "fields": {
      "title": {},
      "name": {}
    }
  }
}





# 大结: 排序 , 排序的时候, 这个 mode:max是个啥意思 

# mode:针对数组数据(多个值)时,指定的取值模式,可选值有 min、max、sum、avg 和 median,当排序采用升序时,默认为 min;排序采用降序时,默认为 max。

GET books/_search
{
  "sort": [
    {
      "price": {
        "order": "desc",
        "mode": "max"
      }
    }
  ]
}




# 大结: 聚合处理




































# 结果返回的各个值说明 , _score 这个值很重要。 











































「真诚赞赏,手留余香」

真诚赞赏,手留余香

使用微信扫描二维码完成支付