結構化搜尋(structured search): 是指有關探詢具有內在結構資料的過程。比如日期、時間和數字都是結構化的:它們有精確的格式,我們可以對這些格式進行邏輯操作。比較常見的操作包括比較數字或時間的範圍,或判定兩個值的大小。
注意:對於結構化文字來說,乙個值要麼相等,要麼不等.
select document from products where price = 20對於精確查詢 , 用term實現:
}在不想被評分(不評分可以提高效率)的時候 , 將term查詢轉化為過濾器 , constant_score表示可以使term查詢以非評分(其實是統一評分 , 結果的_score都是1.0)的方式進行查詢 :
get /my_store/products/_search}}
}}select product from products where productid="xhdk-a-1293-#fj3"直接用剛才的term精確查詢 , 不會得到預期結果,原因是elasticsearch底層的倒排索引 , 將文字查詢進行分析 , 並拆分成詞條 。 查詢一下被分析的結果:
get /my_store/_analyze
結果:, , , ]
}為了使查詢的關鍵字不被分析 , 得告訴elasticsearch這個productid是不被分析的 , 即not_analyzed , 只能更改索引(注意:elasticsearch裡面的索引一旦建立不能被修改 , 只能被刪除和重新建立) 。
更改索引:
刪除原來的索引:
delete /my_store
我們可以建立新的索引並為其指定自定義對映:
put /my_store }}
}}此時再進行剛才的term查詢,會得到與productid完全匹配的預期結果 。
(1)查詢匹配文件 。 在倒排索引中查詢 xhdk-a-1293-#fj3 然後獲取包含該 term 的所有文件。
(2)建立 bitset 。(bitset是乙個只存0或1的陣列),描述了有哪些文件被term到了(比如:如果有4個文件,文件2被term匹配到了,bitset就是[0,1,0,0])
(3)迭代 bitset(s) 。 elasticsearch會為每乙個查詢條件都生成乙個bitset,這些bitset構成了乙個bitsets。elasticsearch 就會迴圈迭代 bitsets 從而找到滿足所有過濾條件的匹配文件的集合。在內部,它表示成乙個 「roaring bitmap」,可以同時對稀疏或密集的集合進行高效編碼。通常會先迭代稀疏的bitset,因為這樣就會首先排除大量的文件。
(4)增量使用計數 。 elasticsearch會快取非評分查詢,如果查詢在最近的 256 次查詢中會被用到,那麼它就會被快取到記憶體中。
select product from products where (price = 20 or productid = "xhdk-a-1293-#fj3") and (price != 30)需要用到bool過濾器 : bool裡面的關鍵字與sql裡面的關鍵字對應(and–>must ; or—>should ; not—>must_not)
get /my_store/products/_search
}, }
],"must_not" : }}
}}
}}注意:組合過濾器需要用filtered套在外面.
select document from products where products where productid="kdke-b-9947-#kl5" or (productid="jodl-x-1937-#pv7" and price=30 )get /my_store/products/_search
}, }, } ]
}}]}}
}}
}select document from products where price in (20,30);get /my_store/products/_search}}
}}注意 : 上面用的是terms , 注意term 和 terms的區別.term相當於sql裡面的」=」 , terms相當於sql裡面的in .
select document from products where price between 20 and 40;get /my_store/products/_search}}
}}
}特殊字元代表的意義:
gt : > 大於(greater than)
lt : < 小於(less than)
gte : >= 大於或等於(greater than or equal to)
lte : <= 小於或等於(less than or equal to)
如果是查詢日期欄位的時候,將上面的過濾器裡面的range換成如下:
"range" :
}"range" :
}"range" :
}範圍查詢也支援字串(字典順序)範圍:
"range" :
}注意 : elasticsearch 實際上是在為範圍內的每個詞項都執行 term 過濾器,這會比日期或數字的範圍過濾慢許多。
在elasticsearch裡面 , 如果欄位不存在,那麼它也不會持有任何 token(倒排索引裡面的詞條)。null (空陣列)和 [null] 所有這些都是等價的,它們無法存於倒排索引中。
select tags from posts where tags is not null;get /my_index/posts/_search}}
}}select tags from posts where tags is null;get /my_index/posts/_search}}
}}關於自定義物件的null :
}實際上是這樣儲存的 :
所以用 exists 或 missing 查詢 name 欄位時 :
}實際上執行的是 :},}
]}
}如果 first 和 last 都是空,那麼 name 這個命名空間才會被認為不存在 .
elasticsearch對非評分查詢是有快取的 , 並且快取的值是bitset , 並且是以增量的形式更新的( 例如新新增乙個文件 , 只需將那些新文件加入已有 bitset , 而不是對整個快取一遍又一遍的重複計算。)
於是就會有下面兩種bool查詢會使用同一 bitset .
讓我們看看下面例子中的查詢,它查詢滿足以下任意乙個條件的電子郵件:
(1)在收件箱中,且沒有被讀過的.
(2)不在 收件箱中,但被標註重要的.
get /inbox/emails/_search
}, }
]}},
},"must": }}}
]}}}
}}如果乙個非評分查詢在最近的 256 詞查詢中被使用過(次數取決於查詢型別),那麼這個查詢就會作為快取的候選。但是,並不是所有的片段都能保證快取 bitset 。只有那些文件數量超過 10,000 (或超過總文件數量的 3% )才會快取 bitset 。因為小的片段可以很快的進行搜尋和合併,這裡快取的意義不大。
一旦快取了,非評分計算的 bitset 會一直駐留在快取中直到它被剔除。剔除規則是基於 lru 的:一旦快取滿了,最近最少使用的過濾器會被剔除。
Elasticsearch 學習筆記
參考 關係型資料庫 elasticsearch 資料庫database索引index,支援全文檢索 表table型別type 資料行row文件document,但不需要固定結構,不同文件可以具有不同字段集合 資料列column字段field 模式schema 索引字段型別numeric dataty...
ElasticSearch學習筆記
2 解壓檔案unzip master.zip 3 允許外掛程式鏈結es,開啟跨域,需要修改elasticsearch的配置檔案elasticsearch.yml,檔案新增兩行 複製 4 進入elasticsearch目錄,啟動elasticsearch.bin elasticsearch 5 安裝e...
elasticsearch筆記 其他
put movies name plot put index doc 1 get index search put index put index doc 1 get index search get twitter search put index put index put index put ...