[elasticsearch笔记] search

本文深入探讨Elasticsearch的高级搜索功能,包括AdaptiveReplicaSelection算法的选择机制,scroll搜索的实现方式,以及多种查询类型如QueryThenFetch和DfsQueryThenFetch的使用场景。此外,还详细介绍了排序、切片、多索引查询、脚本字段、聚合查询等复杂操作,并解释了如何通过调整settings来优化搜索性能。

重点

  • 协调节点(coordinating node)会根据 Adaptive Replica Selection 选择合适的节点处理请求。
  • Adaptive Replica Selection 算法根据以下指标选择处理节点:
    • 协调节点和包含数据节点过去请求的响应时间
    • 包含数据节点过去处理请求的时间
    • 包含数据节点搜索线程池的队列大小
  • 可通过如下方式设置算法,如果关闭,则使用 round robin 决定处理节点(包含 主分片&&副分片)
  • 为了快速响应,一个或者多个分片失败后,search将会返回部分结果
  • 不要使用普通Search做深度搜索,深度搜索使用 Scroll
  • search type
    • Query Then Fetch( query_then_fetch ):根据本地信息计算score。query过程只返回足够的信息(id,score),然后再fetch
    • Dfs, Query Then Fetch( dfs_query_then_fetch ): 预期全局信息,计算score
    • DFS:分布式文件系统
  PUT /_cluster/settings
  {
    "transient": {
      "cluster.routing.use_adaptive_replica_selection": false
    }
  }

scroll search


POST /bank/_search?scroll=1m
{
    "size": 10,
    "query": {
      "match_all": {}
    }
}

POST /_search/scroll 
{
    "scroll" : "10m", 
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAA3UWUDl0LUlXNDdRMHFtSU1wR1N4WG5Fdw==" 
}

DELETE /_search/scroll
{
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAA3UWUDl0LUlXNDdRMHFtSU1wR1N4WG5Fdw=="
}

DELETE /_search/scroll
{
    "scroll_id" : [
      "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==",
      "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrUllkUVlCa1NqNmRMaUhiQlZkMWFBAAAAAAAAAAIWa1JZZFFZQmtTajZkTGlIYkJWZDFhQQAAAAAAAAAFFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAABBZrUllkUVlCa1NqNmRMaUhiQlZkMWFB"
    ]
}

DELETE /_search/scroll/_all

DELETE /_search/scroll/DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==,DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrUllkUVlCa1NqNmRMaUhiQlZkMWFBAAAAAAAAAAIWa1JZZFFZQmtTajZkTGlIYkJWZDFhQQAAAAAAAAAFFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAABBZrUllkUVlCa1NqNmRMaUhiQlZkMWFB

GET /bank/_search?scroll=1m
{
    "slice": {
        "id": 0, 
        "max": 2 
    },
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}
GET /bank/_search?scroll=1m
{
    "slice": {
        "id": 1,
        "max": 2
    },
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}

GET /bank/_search?scroll=1m
{
    "slice": {
        "field": "date",
        "id": 0,
        "max": 10
    },
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}

GET /_nodes/stats/indices/search

sort

GET /my_index/_search
{
  "sort": [
    {
      "post_date": {
        "order": "asc"
      }
    },
    "user",
    {
      "name": "desc"
    },
    {
      "age": "desc"
    },
    "_score"
  ],
  "query": {
    "term": {
      "user": "kimchy"
    }
  }
}

PUT /my_index/_doc/1?refresh
{
  "product": "chocolate",
  "price": [
    20,
    4
  ]
}

POST /my_index/_search
{
  "query": {
    "term": {
      "product": "chocolate"
    }
  },
  "sort": [
    {
      "price": {
        "order": "asc",
        "mode": "avg"
      }
    }
  ]
}

_source


GET /_search
{
    "_source": {
        "includes": [ "obj1.*", "obj2.*" ],
        "excludes": [ "*.description" ]
    },
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

GET /_search
{
    "_source": [ "obj1.*", "obj2.*" ],
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

GET /_search
{
    "_source": "obj.*",
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

GET /_search
{
    "_source": false,
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

stored field

GET /_search
{
    "stored_fields": "_none_",
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

# only _id, _type 
GET /_search
{
    "stored_fields" : [],
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

GET /_search
{
    "stored_fields" : ["user", "postDate"],
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

  • _msearch
GET twitter/_msearch
{}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 10}
{}
{"query" : {"match_all" : {}}}
{"index" : "twitter2"}
{"query" : {"match_all" : {}}}

GET _msearch/template
{"index":"twitter"}
{"source":"{ \"query\": { \"match\": { \"message\" : \"{{keywords}}\" } } } }","params":{"query_type":"match","keywords":"some message"}}
{"index":"twitter"}
{"source":"{ \"query\": { \"match_{{template}}\": {} } }","params":{"template":"all"}}

其他

GET _cat/indices

GET /_search?q=age:32&size=0&terminate_after=1
GET /bank,twitter/_search?q=firstname:Anita

GET /bank/_search
{
  "query": {
    "match": {
      "firstname": "Anita"
    }
  },
  "explain": true
}

GET /_search
{
  "query": {
    "match_all": {}
  },
  "docvalue_fields": [
    "type",
    {
      "field": "age"
    },
    {
      "field": "updated_at",
      "format": "epoch_millis"
    }
  ]
}

GET /bank/_search
{
  "query": {
    "match": {
      "gender": "M"
    }
  },
  "collapse": {
    "field": "age"
  },
  "sort": [
    "age"
  ],
  "from": 5,
  "size": 10
}

GET /_search
{
  "indices_boost": [
    {
      "bank": 1.4
    },
    {
      "kibana*": 1.3
    }
  ]
}


PUT test
{
  "mappings": {
    "properties": {
      "comments": {
        "type": "nested",
        "properties": {
          "votes": {
            "type": "nested"
          }
        }
      }
    }
  }
}

PUT test/_doc/1?refresh
{
  "title": "Test title",
  "comments": [
    {
      "author": "kimchy",
      "number": 1
    },
    {
      "author": "nik9000",
      "number": 2
    }
  ]
}

PUT test/_doc/2?refresh
{
  "title": "Test title",
  "comments": [
    {
      "author": "kimchy",
      "text": "comment text"
    },
    {
      "author": "nik9000",
      "text": "words words words"
    }
  ]
}

PUT test/_doc/3?refresh
{
  "title": "Test title",
  "comments": [
    {
      "author": "kimchy",
      "text": "comment text",
      "votes": []
    },
    {
      "author": "nik9000",
      "text": "words words words",
      "votes": [
        {"value": 1 , "voter": "kimchy"},
        {"value": -1, "voter": "other"}
      ]
    }
  ]
}

POST test/_search
{
  "query": {
    "nested": {
      "path": "comments.votes",
        "query": {
          "match": {
            "comments.votes.voter": "kimchy"
          }
        },
        "inner_hits" : {}
    }
  }
}

POST test/_search
{
  "query": {
    "nested": {
      "path": "comments",
      "query": {
        "match": {"comments.number" : 2}
      },
      "inner_hits": {} 
    }
  }
}

POST test/_search
{
  "query": {
    "nested": {
      "path": "comments",
      "query": {
        "match": {"comments.text" : "words"}
      },
      "inner_hits": {
        "_source" : false,
        "docvalue_fields" : [
          "comments.text.keyword"
        ]
      }
    }
  }
}

GET /_search
{
    "min_score": 0.5,
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

GET /shirts/_search
{
  "query": {
    "bool": {
      "filter": {
        "term": { "brand": "gucci" } 
      }
    }
  },
  "aggs": {
    "agg_colors": {
      "terms": { "field": "color" } 
    },
    "color_red": {
      "filter": {
        "term": { "color": "red" } 
      },
      "aggs": {
        "agg_models": {
          "terms": { "field": "model" } 
        }
      }
    },
    "color_black":{
      "filter":{
        "term":{"color":"black"}
      },
      "aggs":{
        "agg_models":{
          "terms":{"field":"model"}
        }
      }
    }
  },
  "post_filter": { 
    "term": { "color": "red" }
  }
}

POST /_search
{
   "query" : {
      "match" : {
         "message" : {
            "operator" : "or",
            "query" : "the quick brown"
         }
      }
   },
   "rescore" : {
      "window_size" : 50,
      "query" : {
         "rescore_query" : {
            "match_phrase" : {
               "message" : {
                  "query" : "the quick brown",
                  "slop" : 2
               }
            }
         },
         "query_weight" : 0.7,
         "rescore_query_weight" : 1.2
      }
   }
}

POST /_search
{
   "query" : {
      "match" : {
         "message" : {
            "operator" : "or",
            "query" : "the quick brown"
         }
      }
   },
   "rescore" : [ {
      "window_size" : 100,
      "query" : {
         "rescore_query" : {
            "match_phrase" : {
               "message" : {
                  "query" : "the quick brown",
                  "slop" : 2
               }
            }
         },
         "query_weight" : 0.7,
         "rescore_query_weight" : 1.2
      }
   }, {
      "window_size" : 10,
      "query" : {
         "score_mode": "multiply",
         "rescore_query" : {
            "function_score" : {
               "script_score": {
                  "script": {
                    "source": "Math.log10(doc.likes.value + 2)"
                  }
               }
            }
         }
      }
   } ]
}

GET /_search
{
    "query" : {
        "match_all": {}
    },
    "script_fields" : {
        "test1" : {
            "script" : {
                "lang": "painless",
                "source": "doc['price'].value * 2"
            }
        },
        "test2" : {
            "script" : {
                "lang": "painless",
                "source": "doc['price'].value * params.factor",
                "params" : {
                    "factor"  : 2.0
                }
            }
        }
    }
}

GET twitter/_search
{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "search_after": [1463538857, "654323"],
    "sort": [
        {"date": "asc"},
        {"tie_breaker_id": "asc"}
    ]
}



PUT /my_index/_doc/1?refresh
{
  "product": "chocolate",
  "price": [
    20,
    4
  ]
}

POST /my_index/_search
{
  "query": {
    "term": {
      "product": "chocolate"
    }
  },
  "sort": [
    {
      "price": {
        "order": "asc",
        "mode": "avg"
      }
    }
  ]
}

GET /_search
{
    "query" : {
        "term" : { "user" : "kimchy" }
    },
    "sort" : {
        "_script" : {
            "type" : "number",
            "script" : {
                "lang": "painless",
                "source": "doc['field_name'].value * params.factor",
                "params" : {
                    "factor" : 1.1
                }
            },
            "order" : "asc"
        }
    }
}

GET /_search
{
    "track_scores": true,
    "sort" : [
        { "post_date" : {"order" : "desc"} },
        { "name" : "desc" },
        { "age" : "desc" }
    ],
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

GET /_search
{
    "query" : {
        "term" : { "user" : "kimchy" }
    },
    "sort" : {
        "_script" : {
            "type" : "number",
            "script" : {
                "lang": "painless",
                "source": "doc['field_name'].value * params.factor",
                "params" : {
                    "factor" : 1.1
                }
            },
            "order" : "asc"
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值