1. 程式人生 > >Elasticsearch terms查詢

Elasticsearch terms查詢

terms 查詢

只要有被提供的欄位值(未被分析)被文件匹配,該文件將會被此terms查詢匹配。

GET /_search
{
    "query": {
        "terms" : { "user" : ["kimchy", "elasticsearch"]}
    }
}

高亮terms查詢只會盡力,根據所選擇的高亮器的實現以及terms查詢中欄位值的數量,terms查詢中的欄位值可能不會被高亮。

1 欄位值查詢機制

當需要指定具有大量欄位值的terms過濾器時,從索引中的文件中獲取這些欄位值將會非常有用。一個具體的例子就是用於過濾粉絲髮送的推文。可能會在欄位值過濾器中指定大量的使用者id,在這種情況下,使用欄位值過濾器查詢機制就極為重要。

欄位值查詢機制支援以下選項:

  • index:從中獲取欄位值的索引
  • type:從中獲取欄位值的型別
  • id:從中獲取欄位值的文件的id
  • path:設定為用於為terms過濾器獲取確切值的路徑的欄位
  • routing:當檢索外部欄位值文件時,需要使用自定義路由值

terms過濾器的值將會從由指定索引的指定型別的指定id確定的文件的欄位中獲取。在內部,需要執行獲取請求來從指定路徑獲取值。此特性執行時,需要保證_source被儲存。

如果“引用”欄位值資料並不多,考慮使用具有單切片且跨所有節點備份的索引。查詢欄位值過濾器傾向於在本地節點上執行獲取請求,儘量減少網路的使用。

執行具有大量欄位值的terms查詢將會非常緩慢,因為每個附加的欄位值都需要額外的處理與記憶體。為了防止這一情況的發生,用於terms查詢的欄位值的最大數量(無論是直接指定的還是通過查詢機制獲取的)被限制為65536。對於特定索引,可以通過索引設定index.max_terms_count改變這一預設值。

2 案例:使用查詢機制

PUT /users/_doc/2
{
    "followers" : ["1", "3"]
}

PUT /tweets/_doc/1
{
    "user" : "1"
}

note:設定user2的粉絲為user1與user3。

GET /tweets/_search
{
    "query" : {
        "terms" : {
            "user" : {
                "index" : "users",
                "type" : "_doc",
                "id" : "2"
, "path" : "followers" } } } }

note:搜尋user2的粉絲。

從文件查詢獲取terms查詢所需的欄位值,也可以從指定文件的內部物件的陣列的指定欄位中獲取。

PUT /users/_doc/2
{
 "followers" : [
   {
     "id" : "1"
   },
   {
     "id" : "2"
   }
 ]
}

note:查詢路徑設定為followers.id即可。