Gee*_*Jan 10 solr faceted-search elasticsearch
我正在考虑从Solr改为ES.我无法找到的信息之一是ES是否允许我在进行分面时定义排除过滤器.
例如,考虑producttype值:A,B,C我想要面对的(即:显示计数).还要考虑查询是否受约束producttype: A.
在这种情况下,Solr允许我指定我想要排除约束producttype: A影响刻面producttype.IOW,它显示计数,producttype就像producttype: A没有应用约束一样.
如何在Solr中执行此操作请参阅:http://wiki.apache.org/solr/SimpleFacetParameters >标记和排除过滤器
有没有办法在ElasticSearch中执行此操作?
DrT*_*ech 13
是的你可以.
虽然您可以在查询DSL中使用过滤器,但搜索API也接受顶级filter参数,该参数用于在计算构面之后过滤搜索结果.
例如:
1)首先,创建索引,并且因为您希望product_type将其视为枚举,请将其设置为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"
}
}
}
}
}
'
Run Code Online (Sandbox Code Playgroud)
2)索引一些文档(注意,文档3有不同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"
}
'
Run Code Online (Sandbox Code Playgroud)
3)执行的产品名称中包含的搜索foo(不包括文档3,因此product_type C),计算小面为product_type对于具有所有文档foo中product_name,然后过滤通过搜索结果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
# }
Run Code Online (Sandbox Code Playgroud)
4),用于进行搜索foo的product_name,通过指定的,但计算为索引中的所有产品方面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
# }
Run Code Online (Sandbox Code Playgroud)
最新回答OP的扩展问题:
您还可以直接对每个方面应用过滤器 - 这些被称为facet_filters.
以前的类似例子:
1)创建索引:
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"
}
}
}
}
}
'
Run Code Online (Sandbox Code Playgroud)
2)索引一些数据:
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"
}
'
Run Code Online (Sandbox Code Playgroud)
3)搜索,过滤同时具有type== A和color==的产品blue,然后在每个属性上运行构面,不包括"其他"过滤器:
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
# }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2958 次 |
| 最近记录: |