2012-01-18 19 views
10

Tôi đang xem xét thay đổi từ Solr sang ES. Một trong những điều tôi không thể tìm thấy thông tin là liệu ES có cho phép tôi xác định các bộ lọc loại trừ khi có mặt hay không.Elasticsearch: không bao gồm các bộ lọc trong khi có thể thực hiện được? (như trong Solr)

Ví dụ: xem xét producttype với các giá trị: A,B,C mà tôi muốn khía cạnh (nghĩa là: hiển thị số lượng). Đồng thời, hãy xem xét truy vấn bị ràng buộc với producttype: A.

Trong trường hợp này, Solr cho phép tôi chỉ định rằng tôi muốn loại trừ các hạn chế producttype: A khỏi tác động đến mặt trên producttype. IOW, nó hiển thị số lượng trên producttype như thể ràng buộc producttype: A chưa được áp dụng.

Làm thế nào để làm điều này trong Solr xem: http://wiki.apache.org/solr/SimpleFacetParameters> Gắn thẻ và loại trừ Bộ lọc

Có cách nào để làm điều này trong ElasticSearch?

Trả lời

13

Có thể.

Mặc dù bạn có thể sử dụng bộ lọc trong DSL truy vấn, API tìm kiếm cũng chấp nhận tham số filter cấp cao nhất, được sử dụng để lọc kết quả tìm kiếm SAU các khía cạnh đã được tính toán.

Ví dụ:

1) Đầu tiên, tạo index của bạn, và vì bạn muốn product_type được đối xử như một enum, đặt nó vào được not_analyzed:

curl -XPUT 'http://127.0.0.1:9200/my_index/?pretty=1' -d ' 
{ 
    "mappings" : { 
     "product" : { 
     "properties" : { 
      "product_type" : { 
       "index" : "not_analyzed", 
       "type" : "string" 
      }, 
      "product_name" : { 
       "type" : "string" 
      } 
     } 
     } 
    } 
} 
' 

2) Index một số tài liệu (lưu ý, tài liệu 3 có khác nhau product_name):

curl -XPUT 'http://127.0.0.1:9200/my_index/product/1?pretty=1' -d ' 
{ 
    "product_type" : "A", 
    "product_name" : "foo bar" 
} 
' 
curl -XPUT 'http://127.0.0.1:9200/my_index/product/2?pretty=1' -d ' 
{ 
    "product_type" : "B", 
    "product_name" : "foo bar" 
} 
' 
curl -XPUT 'http://127.0.0.1:9200/my_index/product/3?pretty=1' -d ' 
{ 
    "product_type" : "C", 
    "product_name" : "bar" 
} 
' 

3) Thực hiện tìm kiếm các sản phẩm có tên chứa foo (mà không bao gồm doc 3 và do đó product_typeC), tính toán khía cạnh cho product_type cho tất cả các tài liệu có foo trong product_name, sau đó lọc kết quả tìm kiếm bằng cách product_type == A:

curl -XGET 'http://127.0.0.1:9200/my_index/product/_search?pretty=1' -d ' 
{ 
    "query" : { 
     "text" : { 
     "product_name" : "foo" 
     } 
    }, 
    "filter" : { 
     "term" : { 
     "product_type" : "A" 
     } 
    }, 
    "facets" : { 
     "product_type" : { 
     "terms" : { 
      "field" : "product_type" 
     } 
     } 
    } 
} 
' 

# { 
# "hits" : { 
#  "hits" : [ 
#   { 
#    "_source" : { 
#    "product_type" : "A", 
#    "product_name" : "foo bar" 
#    }, 
#    "_score" : 0.19178301, 
#    "_index" : "my_index", 
#    "_id" : "1", 
#    "_type" : "product" 
#   } 
#  ], 
#  "max_score" : 0.19178301, 
#  "total" : 1 
# }, 
# "timed_out" : false, 
# "_shards" : { 
#  "failed" : 0, 
#  "successful" : 5, 
#  "total" : 5 
# }, 
# "facets" : { 
#  "product_type" : { 
#   "other" : 0, 
#   "terms" : [ 
#    { 
#    "count" : 1, 
#    "term" : "B" 
#    }, 
#    { 
#    "count" : 1, 
#    "term" : "A" 
#    } 
#   ], 
#   "missing" : 0, 
#   "_type" : "terms", 
#   "total" : 2 
#  } 
# }, 
# "took" : 3 
# } 

4) Thực hiện tìm kiếm foo trong product_name, nhưng tính toán mặt cho tất cả các sản phẩm trong chỉ mục, bằng cách xác định các tham số global:

# [Wed Jan 18 17:15:09 2012] Protocol: http, Server: 192.168.5.10:9200 
curl -XGET 'http://127.0.0.1:9200/my_index/product/_search?pretty=1' -d ' 
{ 
    "query" : { 
     "text" : { 
     "product_name" : "foo" 
     } 
    }, 
    "filter" : { 
     "term" : { 
     "product_type" : "A" 
     } 
    }, 
    "facets" : { 
     "product_type" : { 
     "global" : 1, 
     "terms" : { 
      "field" : "product_type" 
     } 
     } 
    } 
} 
' 

# [Wed Jan 18 17:15:09 2012] Response: 
# { 
# "hits" : { 
#  "hits" : [ 
#   { 
#    "_source" : { 
#    "product_type" : "A", 
#    "product_name" : "foo bar" 
#    }, 
#    "_score" : 0.19178301, 
#    "_index" : "my_index", 
#    "_id" : "1", 
#    "_type" : "product" 
#   } 
#  ], 
#  "max_score" : 0.19178301, 
#  "total" : 1 
# }, 
# "timed_out" : false, 
# "_shards" : { 
#  "failed" : 0, 
#  "successful" : 5, 
#  "total" : 5 
# }, 
# "facets" : { 
#  "product_type" : { 
#   "other" : 0, 
#   "terms" : [ 
#    { 
#    "count" : 1, 
#    "term" : "C" 
#    }, 
#    { 
#    "count" : 1, 
#    "term" : "B" 
#    }, 
#    { 
#    "count" : 1, 
#    "term" : "A" 
#    } 
#   ], 
#   "missing" : 0, 
#   "_type" : "terms", 
#   "total" : 3 
#  } 
# }, 
# "took" : 4 
# } 

CẬP NHẬT CÂU HỎI CÂU HỎI TIẾP CẬN TỪ OP:

Bạn cũng có thể áp dụng bộ lọc trực tiếp cho từng mặt - chúng được gọi là facet_filters.

ví dụ tương tự với trước:

1) Tạo chỉ số:

curl -XPUT 'http://127.0.0.1:9200/my_index/?pretty=1' -d ' 
{ 
    "mappings" : { 
     "product" : { 
     "properties" : { 
      "color" : { 
       "index" : "not_analyzed", 
       "type" : "string" 
      }, 
      "name" : { 
       "type" : "string" 
      }, 
      "type" : { 
       "index" : "not_analyzed", 
       "type" : "string" 
      } 
     } 
     } 
    } 
} 
' 

2) Index một số dữ liệu:

curl -XPUT 'http://127.0.0.1:9200/my_index/product/1?pretty=1' -d ' 
{ 
    "color" : "red", 
    "name" : "foo bar", 
    "type" : "A" 
} 
' 

curl -XPUT 'http://127.0.0.1:9200/my_index/product/2?pretty=1' -d ' 
{ 
    "color" : [ 
     "red", 
     "blue" 
    ], 
    "name" : "foo bar", 
    "type" : "B" 
} 
' 

curl -XPUT 'http://127.0.0.1:9200/my_index/product/3?pretty=1' -d ' 
{ 
    "color" : [ 
     "green", 
     "blue" 
    ], 
    "name" : "bar", 
    "type" : "C" 
} 
' 

3) Tìm kiếm, lọc các sản phẩm có cả type == Acolor == blue, sau đó chạy các khía cạnh trên mỗi thuộc tính ngoại trừ bộ lọc "khác":

curl -XGET 'http://127.0.0.1:9200/my_index/product/_search?pretty=1' -d ' 
{ 
    "filter" : { 
     "and" : [ 
     { 
      "term" : { 
       "color" : "blue" 
      } 
     }, 
     { 
      "term" : { 
       "type" : "A" 
      } 
     } 
     ] 
    }, 
    "facets" : { 
     "color" : { 
     "terms" : { 
      "field" : "color" 
     }, 
     "facet_filter" : { 
      "term" : { 
       "type" : "A" 
      } 
     } 
     }, 
     "type" : { 
     "terms" : { 
      "field" : "type" 
     }, 
     "facet_filter" : { 
      "term" : { 
       "color" : "blue" 
      } 
     } 
     } 
    } 
} 
' 

# [Wed Jan 18 19:58:25 2012] Response: 
# { 
# "hits" : { 
#  "hits" : [], 
#  "max_score" : null, 
#  "total" : 0 
# }, 
# "timed_out" : false, 
# "_shards" : { 
#  "failed" : 0, 
#  "successful" : 5, 
#  "total" : 5 
# }, 
# "facets" : { 
#  "color" : { 
#   "other" : 0, 
#   "terms" : [ 
#    { 
#    "count" : 1, 
#    "term" : "red" 
#    } 
#   ], 
#   "missing" : 0, 
#   "_type" : "terms", 
#   "total" : 1 
#  }, 
#  "type" : { 
#   "other" : 0, 
#   "terms" : [ 
#    { 
#    "count" : 1, 
#    "term" : "C" 
#    }, 
#    { 
#    "count" : 1, 
#    "term" : "B" 
#    } 
#   ], 
#   "missing" : 0, 
#   "_type" : "terms", 
#   "total" : 2 
#  } 
# }, 
# "took" : 3 
# } 
+0

Cảm ơn. Trong trường hợp đơn giản này hoạt động. Nếu tôi có 2 thuộc tính, ví dụ: 'productcategory' và' color'. Tôi muốn khía cạnh trên cả hai thuộc tính và loại trừ bất kỳ bộ lọc nào được đặt trên thuộc tính mà tôi đang lọc. Vì vậy, faceting trên 'productcategory' loại trừ bất kỳ bộ lọc' productcategory' nào trong khi faceting trên 'color' loại trừ bất kỳ bộ lọc' color' nào. Làm cho facets global không hoạt động trong trường hợp này (tôi tin), vì tôi muốn faceting trên 'productcategory' để lấy bất kỳ bộ lọc' color' có thể có trong tài khoản và ngược lại. Tôi nhận ra đây là một câu hỏi khác. –

+0

Tôi đã mở rộng câu trả lời ở trên, để chứng minh làm thế nào để làm điều đó – DrTech

+0

Tốt để biết sự tồn tại của facet_filters. Tôi có hiểu chính xác rằng chỉ định 'facet_filters' trên một khía cạnh ghi đè bộ lọc (toàn cục) được đặt không? Tôi đã có thể nghĩ rằng tôi cần thiết để thiết lập 'toàn cầu: 1' trên khía cạnh cũng như dictate các khía cạnh để bỏ qua các bộ lọc thiết lập trên toàn cầu. –

Các vấn đề liên quan