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_type
C
), 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
== A
và color
== 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
# }
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. –
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
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. –