本文主要對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"
}
]
具體數據上傳接口:數據處理
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函數(參考filter子句),可以獲取元素個數。
Q3:Java 代碼中推送數據,數組類型應該如何傳入?
A:通過數組類型的變量傳入,例,literal_array--->String [] ,int_array--->int []。