对于一种情况,我需要在一个查询中放置多个搜索条件,以减少我们需要的查询数量。
但是,我需要根据条件区分退货项目。
目前我通过使用功能评分查询实现了这一目标,具体而言:每个条件都分配了一个分数,我可以根据这些分数区分结果。
然而,表现不是那么好。此外,我们现在需要获取每个条件的文档计数。
那么有什么方法可以做到吗?我正在考虑使用聚合,但不确定我是否可以这样做。
谢谢!
更新:
curl -X GET 'localhost:9200/locations/_search?fields=_id&from=0&size=1000&pretty' -d '{
"query":{
"bool":{
"should":[
{
"filtered":{
"filter":{
"bool":{
"must":[{"term":{"city":"new york"}},{"term":{"state":"ny"}}]
}
}
}
},
{
"filtered":{
"filter":{
"bool":{
"must":[{"term":{"city":"los angeles"}},{"term":{"state":"ca"}}]
}
}
}
}
]
}
}}'
答案 0 :(得分:0)
回答问题的第一部分,名称查询是最好的。 例如:
{
"query": {
"bool": {
"should": [
{
"match": {
"field1": {
"query": "qbox",
"_name": "firstQuery"
}
}
},
{
"match": {
"field2": {
"query": "hosted Elasticsearch",
"_name": "secondQuery"
}
}
}
]
}
}
}
这将为每个匹配返回一个名为matched_queries的附加字段,该字段将包含与该文档匹配的查询的信息。 您可以在名称查询here
上找到更多信息但是这个信息不能用于汇总。 因此,您需要以单独的方式处理问题的第二部分。 每个查询类型的过滤器聚合将是这里的想法解决方案。 例如:
{
"query": {
"bool": {
"should": [
{
"match": {
"text": {
"query": "qbox",
"_name": "firstQuery"
}
}
},
{
"match": {
"source": {
"query": "elasticsearch",
"_name": "secondQuery"
}
}
}
]
}
},
"aggs": {
"firstQuery": {
"filter": {
"term": {
"text": "qbox"
}
}
},
"secondQuery": {
"filter": {
"term": {
"source": "elasticsearch"
}
}
}
}
}
您可以在过滤器聚合here
上找到更多信息