本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Amazon CloudSearch 中取得和使用面向資訊
「面向」是一種索引欄位,代表您要用以縮小搜尋範圍和篩選搜尋結果的類別。當您將搜尋請求提交至 Amazon CloudSearch 時,您可以請求面向資訊,以了解有多少文件在特定欄位中共用相同的值。此資訊可隨搜尋結果一同顯示,且能用於讓使用者透過互動方式縮小搜尋範圍 (通常稱之為分面瀏覽或分面搜尋。)
您可在搜尋請求中指定 facet.FIELD
參數,以取得任何啟用面向分類欄位的面向資訊。根據預設,Amazon CloudSearch 會傳回前 10 個值的面向計數。如需如何使欄位能夠傳回面向的詳細資訊,請參閱configure indexing options。如需 facet.FIELD
參數的說明,請參閱「搜尋 API 參考」一文的搜尋請求參數。
您可指定各種面向選項,以控制各欄位面向值的排序方式、限制傳回的面向值數目,或選擇欲列入計數和傳回的面向值。
在 Amazon CloudSearch 中取得面向資訊
若要取得欄位的面向資料,請使用 facet.FIELD
參數。FIELD
是可使用面向的欄位名稱。面向選項是指定成 JSON 物件。如果 JSON 物件是空的 (facet.FIELD={}
),則會對所有欄位值計算面向數量,依面向數量將面向排序,並隨結果傳回前 10 名的面向。您可以透過同一次請求,請求多個欄位的面向資訊。
您可透過兩種方式擷取面向資訊:
sort
- 傳回依面向數量或面向值排序的面向資訊。buckets
- 傳回特定面向值或範圍的面向資訊。
面向資訊排序
您要指定 sort
選項以控制面向資訊的排序方式。排序選項有兩種:count
和 bucket
:
-
使用
count
將面向依面向數量排序。例如,facet.year={sort:'count'}
可計算年份值相同的相符項目數並將面向資訊依該數目排序。 -
使用
bucket
將面向依面向值排序。例如,facet.year={sort:'bucket'}
。
使用 sort
選項時,您可指定 size
選項以控制要隨結果傳回的面向值數目上限。size
選項僅限於使用 sort
選項時有效。
以下範例可計算 genres
欄位的面向資訊、將電影類型依面向值排序,並隨結果傳回前 5 大類型:
facet.genres={sort:'bucket', size:5}
依值區歸納面向資訊
您可以使用 buckets
選項,明確指定您要計算其數量的面向值或範圍。值區是指定成值或範圍的陣列,例如 facet.color={buckets:["red","green","blue"]}
。
若要指定值的範圍,請使用逗號 (,) 來區隔上下限,並以括號將範圍括住。方形括號 【 或 】 表示邊界包含在範圍中,曲線括弧 { 或 } 排除邊界。您可以省略上限或下限,以指定開放式範圍。省略邊界時,您必須使用彎曲的支架。例如:facet.year={buckets:["[1970,1979]","[1980,1989]",
"[1990,1999]","[2000,2009]","[2010,}"]}
。對於時間戳記,您可以使用 q=-poet&facet.release_date={buckets:["[\'1980-01-01T00:00:00Z\',\'1986-01-01T00:00:01Z\']"]}
。
如果指定了值區,sort
和 size
選項即無效。
Amazon CloudSearch 支援兩種計算儲存貯體計數的方法,filter
以及 interval
。預設會使用 filter
方法,即是直接就各值區提交額外的篩選條件查詢以取得值區數目。儘管此方法在多數情況下效果良好,但若您的更新率偏高或要擷取大量的面向,其效能將難免不佳,因為這類查詢無法獲致內部快取機制的優點。
如果您依值區歸納面向時發生查詢效能遲緩的狀況,請嘗試將值區方法設為 interval
,其會後置處理結果集而非提交多次查詢:
facet.year={buckets:["[1970,1979]","[1980,1989]","[1990,1999]"],method:"interval"}
建議您親自執行效能測試,以判定哪種方法最適合您的應用程式。一般而言,如果您的更新率相當低且不是擷取大量的值區,則 filter
方法較為快速。不過,若您的更新率偏高或有大量的值區,使用 interval
方法後置處理結果集將可明顯加快查詢效能。
在 Amazon CloudSearch 中使用面向資訊
您可以顯示面向資訊,讓使用者更方便瀏覽搜尋結果並找出自己感興趣的資訊。例如,使用者若嘗試尋找某一部《星艦迷航記》(Star Trek) 系列電影但不記得完整的片名,可能就會先搜尋 star。若您想要顯示 genre (類型) 排在最前的面向,便可使用 facet.FIELD
進行查詢並指定欲擷取的各個面向的面向值數目:
search?q=star&facet.genres={sort:'count',size:5}&format=xml&return=_no_fields
上述範例的搜尋回應將提供以下資訊:
<results>
<status rid="v7r9hs8oFQqMHnk=" time-ms="3"/>
<hits found="85" start="0">
<hit id="tt1411664"/>
<hit id="tt1911658"/>
<hit id="tt0086190"/>
<hit id="tt0120601"/>
<hit id="tt2141761"/>
<hit id="tt1674771"/>
<hit id="tt0056687"/>
<hit id="tt0397892"/>
<hit id="tt0258153"/>
<hit id="tt0796366"/>
</hits>
<facets>
<facet name="genres">
<bucket value="Comedy" count="41"/><bucket value="Drama" count="35"/>
<bucket value="Adventure" count="29"/>
<bucket value="Sci-Fi" count="24"/>
<bucket value="Action" count="20"/>
</facet>
</facets>
</results>
Amazon CloudSearch 中的多選取面向
若您想要顯示可用的面向並讓使用者能夠選取多個值以獲得更精確的結果,便可提交一次請求以取得符合面向限制條件的文件,並且提交額外的請求以取得面向數量。
例如,電影範例資料的 genres
、rating
和 year
欄位皆已啟用面向分類。如果使用者搜尋 poet 一詞,您即可提交以下請求,取得符合條件的電影以及 genres
、rating
和 year
欄位的面向數量:
q=poet&facet.genres={}&facet.rating={}&facet.year={}&return=_no_fields
由於未指定facet.FIELD
任何選項,Amazon CloudSearch 會計算所有構面值,並傳回每個構面的前 10 個值:
{
"status" : {
"rid" : "it3T8tIoDgrUSvA=",
"time-ms" : 5
},
"hits" : {
"found" : 14,
"start" : 0,
"hit" : [
{"id" : "tt0097165"},
{"id" : "tt0059113"},
{ "id" : "tt0108174"},
{"id" : "tt1067765"},
{ "id" : "tt1311071"},
{"id" : "tt0810784"},
{"id" : "tt0819714"},
{"id" : "tt0203009"},
{"id" : "tt0114702"},
{"id" : "tt0107840"} ]
},
"facets" : {
"genres" : {
"buckets" : [
{"value" : "Drama","count" : 12},
{"value" : "Romance","count" : 9},
{"value" : "Biography", "count" : 4},
{"value" : "Comedy","count" : 2},
{"value" : "Thriller","count" : 2},
{"value" : "War","count" : 2},
{"value" : "Crime","count" : 1},
{"value" : "History","count" : 1},
{"value" : "Musical","count" : 1} ]
},
"rating" : {
"buckets" : [
{"value" : "6.3","count" : 3},
{"value" : "6.2","count" : 2},
{"value" : "7.1","count" : 2},
{"value" : "7.9","count" : 2},
{"value" : "5.3","count" : 1},
{"value" : "6.1""count" : 1},
{"value" : "6.4","count" : 1},
{"value" : "6.9","count" : 1},
{"value" : "7.6","count" : 1} ]
},
"year" : {
"buckets" : [
{"value" : "2013","count" : 3},
{"value" : "1993","count" : 2},
{"value" : "1965","count" : 1},
{"value" : "1989","count" : 1},
{"value" : "1995","count" : 1},
{"value" : "2001","count" : 1},
{"value" : "2004","count" : 1},
{"value" : "2006","count" : 1},
{"value" : "2008","count" : 1},
{"value" : "2009","count" : 1} ]
}
}
}
當使用者透過選取面向值的方式縮小搜尋範圍時,您要使用其所選面向以篩選結果。例如,使用者若選取 2013、2012 和 1993,以下請求將取得符合條件於該三個年份發行的電影:
q=poet&fq=(or year:2013 year:2012 year:1993)&facet.genres={}&facet.rating={}
&facet.year={}&return=_no_fields
如此便會取得符合使用者所選值的文件以及套用了篩選條件的面向數量:
{
"status" : {
"rid" : "zMP38tIoDwrUSvA=",
"time-ms" : 6
},
"hits" : {
"found" : 6,
"start" : 0,
"hit" : [
{"id" : "tt0108174"},
{"id" : "tt1067765"},
{"id" : "tt1311071"},
{"id" : "tt0107840"},
{"id" : "tt1462411"},
{"id" : "tt0455323"} ]
},
"facets" : {
"genres" : {
"buckets" : [
{"value" : "Drama","count" : 4},
{"value" : "Romance","count" : 3},
{"value" : "Comedy","count" : 2},
{"value" : "Thriller","count" : 2},
{"value" : "Biography","count" : 1},
{"value" : "Crime","count" : 1} ]
},
"rating" : {
"buckets" : [
{"value" : "6.3","count" : 2},
{"value" : "5.3","count" : 1},
{"value" : "6.2","count" : 1},
{"value" : "6.4","count" : 1},
{"value" : "7.1","count" : 1} ]
},
"year" : {
"buckets" : [
{"value" : "2013","count" : 3},
{"value" : "1993","count" : 2},
{"value" : "2012","count" : 1} ]
}
}
}
這就是您想要顯示的電影類型和評價。不過,為了讓使用者能夠變更年份篩選條件,您必須取得非其所選年份的面向數量。因此,您要提交第二次請求,以不設篩選條件的方式擷取年份欄位的面向數量:
q=poet&facet.year={}&size=0
由於無須擷取相符的文件,size
參數即設為零以盡量避免請求延遲。此次請求僅傳回 year
欄位的面向資訊:
{
"status" : {
"rid" : "x/7r0NIoRwqlHfo=",
"time-ms" : 4
},
"hits" : {
"found" : 14,
"start" : 0,
"hit" : [ ]
},
"facets" : {
"year" : {
"buckets" : [
{"value" : "2013","count" : 3},
{"value" : "1993","count" : 2},
{"value" : "1965","count" : 1},
{"value" : "1989","count" : 1},
{"value" : "1995","count" : 1},
{"value" : "2001","count" : 1},
{"value" : "2004","count" : 1},
{"value" : "2006","count" : 1},
{"value" : "2008","count" : 1},
{"value" : "2009","count" : 1} ]
}
}
}
如要縮短回應時間,您可以隨同取得篩選過後結果的請求,平行傳送此次請求。不過請切記,這類額外的請求可能會影響您的整體查詢效能,而且或許還需要擴展您的網域規模以便處理額外的流量 (如需調整規模的詳細資訊,請參閱在 Amazon CloudSearch 中設定擴展選項)。
若使用者又選取電影類型或評價進一步縮小搜尋範圍,您就要將其添加到篩選條件以取得相符的文件。例如,以下請求將取得 2013、2012 或 1993 年發行且評價為 6.3 的電影:
q=poet&fq=(and rating:6.3 (or year:2013 year:2012 year:1993))&facet.genres={}&return=_no_fields
此次請求欲取得電影類型的面向資訊,將傳回已套用評價和年份篩選條件的面向數量:
{
"status" : {
"rid" : "l66b89IoEArUSvA=",
"time-ms" : 6
},
"hits" : {
"found" : 2,
"start" : 0,
"hit" : [
{"id" : "tt1462411"},
{"id" : "tt0455323"} ]
},
"facets" : {
"genres" : {
"buckets" : [
{"value" : "Drama","count" : 2} ]
}
}
}
為了讓使用者能夠選取其他評價,您要另再提交一次請求以取得僅套用年份篩選條件的評價面向數量:
q=poet&fq=(or year:2013 year:2012 year:1993)&facet.rating={}&size=0
此次請求將得到以下回應:
{
"status" : {
"rid" : "jqWj89IoEQrUSvA=",
"time-ms" : 5
},
"hits" : {
"found" : 6,
"start" : 0,
"hit" : [ ]
},
"facets" : {
"rating" : {
"buckets" : [
{"value" : "6.3","count" : 2},
{"value" : "5.3","count" : 1},
{"value" : "6.2","count" : 1},
{"value" : "6.4","count" : 1},
{"value" : "7.1","count" : 1} ]
}
}
}
同樣地,您還需要再提交一次請求以取得僅套用評價篩選條件的年份面向數量:
q=poet&fq=rating:6.3&facet.year={}&size=0
此次請求將得到以下回應:
{
"status" : {
"rid" : "4L6F8NIoDQrUSvA=",
"time-ms" : 4
},
"hits" : {
"found" : 3,
"start" : 0,
"hit" : [ ]
},
"facets" : {
"year" : {
"buckets" : [
{"value" : "1995","count" : 1},
{"value" : "2012","count" : 1},
{"value" : "2013","count" : 1} ]
}
}
}