es中一个query中的多个搜索条件,并根据条件区分items
multiple search conditions in one query in es and distinguish the items according to the conditions
对于一个案例,我需要在一个查询中放置多个搜索条件,以减少我们需要的查询数量。
但是我需要根据条件区分退货商品
目前我是通过函数score query实现的,具体是:每个条件都分配一个score,我可以根据这些score来区分结果。
但是,性能不是很好。另外现在我们需要获取每个条件的文档计数。
那有什么办法吗?我正在考虑使用聚合,但不确定我是否可以这样做。
谢谢!
更新:
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"}}]
}
}
}
}
]
}
}}'
好吧,回答你问题的第一部分,名称查询是最好的。
例如:
{
"query": {
"bool": {
"should": [
{
"match": {
"field1": {
"query": "qbox",
"_name": "firstQuery"
}
}
},
{
"match": {
"field2": {
"query": "hosted Elasticsearch",
"_name": "secondQuery"
}
}
}
]
}
}
}
这将为每个命中 return 一个名为 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
对于一个案例,我需要在一个查询中放置多个搜索条件,以减少我们需要的查询数量。
但是我需要根据条件区分退货商品
目前我是通过函数score query实现的,具体是:每个条件都分配一个score,我可以根据这些score来区分结果。
但是,性能不是很好。另外现在我们需要获取每个条件的文档计数。
那有什么办法吗?我正在考虑使用聚合,但不确定我是否可以这样做。
谢谢!
更新:
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"}}]
}
}
}
}
]
}
}}'
好吧,回答你问题的第一部分,名称查询是最好的。 例如:
{
"query": {
"bool": {
"should": [
{
"match": {
"field1": {
"query": "qbox",
"_name": "firstQuery"
}
}
},
{
"match": {
"field2": {
"query": "hosted Elasticsearch",
"_name": "secondQuery"
}
}
}
]
}
}
}
这将为每个命中 return 一个名为 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