1.mapping 中fields字段(子选项为keyword时候子选项不分词,一方面可以满足分词搜索,另一方面可以聚合查询)
PUT zhang
{
"mappings": {
"properties": {
"name":{
"type":"text",
"fields": {
"keyword":{
"type":"keyword"
}
}
}
}
}
}
我们添加两条数据
POST zhang/_doc
{
"name":"wang ba"
}
POST zhang/_doc
{
"name":"jack ma"
}
我们试着用主字段搜索
GET zhang/_search
{
"query":{
"match":{
"name": "ma"
}
}
}
可以看到是能够搜索出来的。然而我们用
GET zhang/_search
{
"query":{
"match":{
"name.keyword": "ma"
}
}
}
这样是没法搜出来的,因为子选项是完全匹配没有分词,正确的搜索应该是这样的
GET zhang/_search
{
"query":{
"match":{
"name.keyword": "jack ma"
}
}
}
2.算分相关性计算
过滤查询(Filtering queries)只是简单的检查包含或者排除,这就使得计算起来非常快。考虑到至少有一个过滤查询(filtering query)的结果是 “稀少的”(很少匹配的文档),并且经常使用不评分查询(non-scoring queries),结果会被缓存到内存中以便快速读取,所以有各种各样的手段来优化查询结果。
相反,评分查询(scoring queries)不仅仅要找出匹配的文档,还要计算每个匹配文档的相关性,计算相关性使得它们比不评分查询费力的多。同时,查询结果并不缓存。
常见不使用评分的查询
1.must not
2.filter
3.constant_score
3.index 属性 false,和not_analyzed 区别 (false 是不允许搜索的,并且属性是 false时候,type必须是keywords, not_analyzed是不分词的)
PUT zhang
{
"mappings": {
"properties": {
"name":{
"type":"text",
"index": "not_analyzed"
}
}
}
}
PUT zhang
{
"mappings": {
"properties": {
"name":{
"type":"keywords",
"index": false
}
}
}
}
4.null 搜索(type 必须是keyword)
PUT zhang
{
"mappings": {
"properties": {
"name":{
"type":"keyword",
"null_value": "null"
}
}
}
}
POST zhang/_doc
{
"name":null
}
GET zhang/_search
{
"query":{
"match":{
"name":"null"
}
}
}
es 批量更新
curl -XPOST "http://10.134.3.64:19200/threads/_update_by_query?conflicts=proceed" -H 'content-Type:application/json' -d '{"script": {"lang": "painless","inline": "if (
ctx._source.sink== null) {ctx._source.sink= 0}"}}'