天天看點

Elasticsearch 結構化搜尋、keyword、Term查詢

Elasticsearch 中的結構化搜尋,即面向數值、日期、時間、布爾等類型資料的搜尋,這些資料類型格式精确,通常使用基于詞項的term精确比對或者prefix字首比對。本文還将新版本的“text”,“keyword”進行說明,還有Term查詢。

結構化搜尋(Structured search) 是指對結構化的資料進行搜尋。比如日期、時間和數字都是結構化的,它們有精确的格式,我們可以對這些格式進行邏輯操作。比較常見的操作包括比較數字或時間的範圍、判定兩個值的大小、字首比對等。

文本也可以是結構化的。如彩色筆可以有離散的顔色集合: 紅(red) 、 綠(green) 、 藍(blue) 。一個部落格可能被标記了關鍵詞 分布式(distributed) 和 搜尋(search) 。電商網站上的商品都有 UPCs(通用産品碼 Universal Product Codes)或其他的唯一辨別,它們都需要遵從嚴格規定的、結構化的格式。

在結構化查詢中,我們得到的結果隻有“是”或“否”兩個值,可以根據場景需要,決定結構化搜尋是否需要打分,但通常我們是不需要打分的。

讓我們以下面的例子開始介紹,建立并索引一些表示産品的文檔,文檔裡有字段 <code>price</code> ,<code>productID</code>,<code>show</code>,<code>createdAt</code>,<code>tags</code> ( <code>價格</code>,<code>産品ID</code>,<code>是否展示</code>,<code>建立時間</code>, <code>打标資訊</code>)

現在我們想要做的是查找具有某個價格的所有産品,假設我們要擷取價格是20元的商品,我們可以使用 term 查詢,如下

通常查找一個精确值的時候,我們不希望對查詢進行評分計算。隻希望對文檔進行包括或排除的計算,是以我們會使用 constant_score 查詢以非評分模式來執行 term 查詢并以1.0作為統一評分。

最終組合的結果是一個 constant_score 查詢,它包含一個 term 查詢:

對于數字,一般還有範圍查詢

range 支援的選項

gt: &gt; 大于(greater than)

lt: &lt; 小于(less than)

gte: &gt;= 大于或等于(greater than or equal to)

lte: &lt;= 小于或等于(less than or equal to)

搜尋一定時間範圍内的文檔

日期比對表達式

y 年

M 月

w 周

d 天

H/h 小時

m 分鐘

s 秒

“productID.keyword”中的“keyword”不是關鍵字,而是Elasticsearch在插入文檔的時候,自動為“productID”生成的子字段,名字是“keyword”。

存在用“exists”,不存在用“must_not”搭配“exists”

注意,新版本不要再使用“missing”關鍵字,現在已經廢除了,用“must_not”做取反。

使用“missing”會報錯,報錯資訊如下:

在2.x版本裡面文本使用的是string字段。

5.0之後,把string字段設定為了過時字段,引入text與keyword字段,這兩個字段都可以存儲字元串使用。

“text”用于全文搜尋,“keyword”用于結構化搜尋。“keyword”類似Java中的枚舉。在新版本中,如果沒有自己建立mapping,那麼在文本的進行中,會把文本自動映射為“text”,同時會生成一個子字段“keyword”,類型是“keyword”。

在存儲上,“text”會被分詞器進行分詞,而“keyword”會被原樣保留。比如“Rabit is jumping”,“text”的情況下可能被存儲為“rabit”,“jump”,而“keyword”情況下就會存儲為“Rabit is jumping”。

在ES中,term查詢,對輸入不做分詞,會将輸入作為一個整體,在反向索引中查找精确的詞項,并且使用相關性算分公式為每個包含該詞項的文檔進行相關度算分。

比如上面的("productID": "QQPX-R-3956-#aD8"),會被分詞為“qqpx”,“r”,“3956”,“ad8”。

“productID.keyword”的類型是keyword,是以即使使用match查詢,最終也會變成Term查詢。

https://www.elastic.co/guide/cn/elasticsearch/guide/current/structured-search.html

https://www.elastic.co/guide/en/elasticsearch/reference/5.5/keyword.html

https://www.elastic.co/guide/en/elasticsearch/reference/7.x/term-level-queries.html

__EOF__

歡迎轉載,但請注明出處!

歡迎大家一起交流學習!如果有什麼疑問,大家可以在評論區一起交流!

如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。您的鼓勵是我的最大動力!