elasticsearch筆記 結構化搜尋 四

2021-12-30 11:46:47 字數 3591 閱讀 4748

結構化搜尋(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 ...