本文主要對Array類型的使用情境、資料推送及搜尋文法進行系統的介紹,方便大家理解。
什麼情境下適合使用ARRAY類型?
Array類型即為數群組類型,數群組類型即由相同類型的若干個元素組織在一起的資料,期望在搜尋的時候對於每一個元素都可以執行單獨的查詢。比如小說的標籤tags,包含“懸疑”、“穿越”、“古典”,希望在搜尋“懸疑”的時候能找到該篇小說。
如何推送ARRAY類型的資料?
目前OpenSearch支援多種方式的資料推送方式,那我們就從每個途徑來分開闡述如何進行資料推送。
API方式
ARRAY類型需要採用JsonArray的方式來上傳資料。如:
[
{
"fields": {
"id": "0",
"int_array": [
14,
85
],
"float_array": [
14.0,
85.0
],
"literal_array": [
"abc",
"xyz"
]
},
"cmd": "ADD"
}
]具體資料上傳介面,請參考開發指南->V3(標準/進階)API參考手冊->應用操作介面->資料處理
SDK方式
可以參考JAVA SDK樣本:Push推送Demo,其他SDK做法類似。
資料來源方式
資料來源配置允許使用者對於資料來源資料進行多種格式的解析操作,如果定義了ARRAY類型的欄位,可以在該欄位上選擇MultiValueSpliter外掛程式,定義好多值分隔字元,比如上例中的tags,在資料庫表中欄位內容為:“穿越,懸疑,言情”,那麼多值分隔字元為英文逗號:“,”,如圖所示即可。該外掛程式會自動將資料庫中欄位轉化成為引擎識別的ARRAY類型。MultiValueSpliter外掛程式

ARRAY類型如何進行檢索?能實現怎樣的效果?
ARRAY類型的每一個元素都可以單獨訪問,不管是用在query子句,還是filter子句,如上例中的tags欄位(內容為:穿越,懸疑,言情),可以通過query=tags:'穿越',來找到該文檔;也可以通過query=title:'步步驚心'&&filter=tags="穿越",來實現標籤為“穿越”的名字包含“步步驚心”的小說。
同時需要注意一點的是,搜尋結果對於Array類型是按照字串返回的,元素之間使用’\t’分隔,而不是數組。
FAQ
Q1: 為什麼沒有text_array類型,text與string_array有什麼區別?
A: text類型(包含text、short_text、nws_text、mws_text)涉及到分詞,本身支援的是模糊搜尋,所以沒有數組的概念,而string_array指的是每個元素的精確匹配,很可能這裡的單個元素本身是由多個片語組成的,但是沒關係要求的是全部匹配。
Q2: 有沒有方法獲得array類型的元素個數?
A: 系統提供了fieldlen函數,可以擷取元素個數。
Q3:Java 代碼中推送資料,數群組類型應該如何傳入?
A:通過數群組類型的變數傳入,例,literal_array--->String [] ,int_array--->int []。