Schema
OpenSearch支援多種資料類型及分詞方式,可以滿足絕大多數情境下的需求。具體參考如下:
目前支援的類型:INT、FLOAT、DOUBLE、LITERAL及其各自的ARRAY類型、TEXT、SHORT_TEXT;
DynamicField:暫不支援,OpenSearch支援修改應用結構,可以先通過動態修改的方式來繞過;
CopyField:暫不支援,可以離線預先合并。
欄位個數限制:256。超過限制的業務可以考慮將非區間段查詢(精準匹配)的若干欄位利用ARRAY類型合并成一個欄位,來減少總欄位個數的方式繞過。
patternTokenizer:目前OpenSearch支援自訂分詞,但是分隔字元預設為\t,需要將原有分隔字元轉化為\t即可。
location:轉化為兩個欄位float或者double欄位,分別用來儲存經緯度值。
bool:轉化為INT型,值為0/1。
date:轉化為INT型,資料庫源會自動轉成毫秒時間戳記,API推送的需要手動轉化;
payload analyzer:暫不支援。
bitwise分詞:暫不支援。
庖丁分詞:使用OpenSearch中文基礎分詞。
搜尋文法
OpenSearch目前支援查詢、過濾、統計、彙總、排序等功能。
q:必選參數,相當於OpenSearch中query查詢,具體轉化規則如下:
q 轉化規則 |
|---|
‘:‘ 暫不支援 |
range索引,用filter的區間段來轉化 |
+A ==> A |
-A ==> 不支援 |
A AND B ==> A AND B |
A AND -B ==> A ANDNOT B |
A OR B ==> A OR B |
A OR +B ==> A RANK B |
A AND B OR C ==> A AND B RANK C, e.g:紅富士 AND 蘋果 OR 山東 |
A OR B AND C ==> B AND C RANK A, e.g:紅富士 OR 蘋果 AND 山東 |
A AND B OR +C ==> A AND B AND C, e.g:紅富士 AND 蘋果 OR +山東 |
A OR +B AND C ==> B AND C RANK A, e.g:紅富士 OR +蘋果 AND 山東 |
+A OR B AND C ==> A AND B AND C, e.g:+紅富士 OR 蘋果 AND 山東 |
A AND B OR -C ==> (A AND B) ANDNOT C, e.g:紅富士 AND 蘋果 OR -山東 |
A AND -B OR C ==> A ANDNOT B RANK C, e.g:蘋果 AND -紅富士 OR 山東 |
-A AND B OR C ==> B ANDNOT A RANK C, e.g:-紅富士 AND 蘋果 OR 山東 |
A OR B AND -C ==> B ANDNOT C RANK A, e.g:紅富士 OR 蘋果 AND -山東 |
A OR -B AND C ==> C ANDNOT B RANK A, e.g:紅富士 OR -山東 AND 蘋果 |
-A OR B AND C ==> (B AND C) ANDNOT A, e.g:-紅富士 OR 山東 AND 蘋果 |
A OR B OR -C == A OR -C OR B == -C OR A OR B ==> (A OR B) ANDNOT C |
A AND B OR C AND D ==> A AND B AND C AND D |
fq:用來過濾,隻影響召回不影響算分。非模糊查詢使用filter,模糊查詢走query,排序的時候不要考慮該欄位即可;
fl:使用OpenSearch fetch_fields參數來定義傳回值;
hl:在控制台上配置結果摘要和飄紅;
start,rows: config 子句中的start和hit;
wt:config子句中的format;
df:查詢的預設欄位;
sort:filed desc => -filed;field asc=> +field;score=>sort=RANK;
facet:欄位必須配置索引屬性。
統計轉化規則 |
|---|
facet.field => OpenSearch aggregate子句中的group_key參數 |
facet.limit => OpenSearch aggregate子句中的max_group,預設為1000 |
facet.mincount => 暫不支援,需要全部結果拿回去自行處理 |
facet.offset => 暫不支援,需要全部結果拿回去自行翻頁 |
facet.sort => 暫不支援,需要全部結果拿回去自行排序 |
facet=true&facet.field=price&facet.limit=200 ==> aggregate=group_key:price,agg_fun:count(),max_group:200 |
group:暫不支援。某些簡單的情境可以考慮OpenSearch中的distinct子句,並結合sort來做組內排序。
stats:部分功能對應OpenSearch中的aggregate子句,但是agg_func僅支援min, max, count, avg,暫不支援missing、sumOfSquares、mean、stddev、distinctValue、countDistinct。
搜尋功能
深度翻頁:目前OpenSearch提供兩個查詢介面,一個是search,一個是scroll。search是常規的查詢情境,最多支援5000個結果返回,可以翻頁,每頁最大500個;scroll為資料匯出情境,可以支援千萬層級資料匯出,但不支援排序,可以將結果拿回去做二次分析。
統計結果準確性:為了保證更優的檢索效能,目前OpenSearch在很多情況下會做抽樣和預估,這樣會導致統計結果不是很精準。
搜尋結果total值:為了保證搜尋效能,資料量很大的情況下(跟總資料量無關,主要是查詢召回量超過百萬以上),仍然會做預估。
多OR查詢:目前query長度限制編碼後1K,如果OR查詢較多會導致報錯無結果,建議增加個數限制,或者並發多次查詢再自行做結果merge。