【程式設計】ElasticSearch更多的內容
入門只是第一步,想要成功刪庫跑路,還有很長的路要走,學而時習之。這篇用於記錄入門之後遇到的更多狀況,待更新。
大家也可以點這裡,檢視雖然過時,但也有一定參考價值的Elasticsearch: 權威指南(中文版)。
當然,英文好的小夥伴還是翻看和自己所使用的ElasticSearch相同的英文版本,進去之後找到自己關注的目錄點other version。
順便說一句我的示例程式碼是基於6.4.2的,有些部分可能有差別。
1、巢狀物件查詢nested/mapping
假如咱們要存的資料有更復雜的巢狀關係,比如物件中的一個屬性是一個新的物件陣列:
簡歷中的語言能力是一個物件組成的陣列:
POST my_index/resume/1
{
"language" : [
{"class":"eng", "rank": 100},
{"class":"jap", "rank": 60},
{"class":"spa", "rank": 70}
],
"name": "zhangsan"
}
試圖搜尋英文70分的人,卻會搜出英文100分、日文70分的文件。原因:戳這裡
GET my_index/resume/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"language.class": {
"value": "eng"
}
}
},{
"term": {
"language.rank": {
"value": "70"
}
}
}
]
}
}
}
要想實現這樣複雜結構的搜尋,需要使用巢狀結構,先用mappings/nested來定義這個結構:
GET my_index/_mapping/resume
DELETE my_index
PUT my_index
{
"mappings": {
"resume": {
"properties": {
"language": {
"type": "nested",
"properties": {
"class": {"type": "text"},
"rank": {"type": "integer"}
}
},
"name":{
"type": "text"
}
}
}
}
}
再用nested關鍵字來搜尋:
GET my_index/resume/_search
{
"query": {
"nested": {
"path": "language",
"query": {
"bool": {
"must": [
{
"term": {
"language.class": {
"value": "eng"
}
}
},
{
"term": {
"language.rank": {
"value": 100
}
}
}
]
}
}
}
}
}
二、ElasticSearch深分頁scroll和淺分頁from-size
簡介:
from-size,先查出全量然後從全量的from位置開始,取出size數量的文件。scroll,先通過_search/scroll命令查出卷標,然後通過卷標找出對應的文件集合。
https://www.cnblogs.com/xing901022/archive/2016/03/16/5284902.html(效率比較、寫法比較)
https://www.jianshu.com/p/14aa8b09c789(scroll原理詳解、引數意義)