当前位置: 首页 > 知识库问答 >
问题:

如何根据字段值过滤ElasticSearch结果?

黎玺
2023-03-14

下面是我的搜索响应示例,检索到4个结果。

{
    "took": 13,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
        "total": 4,
        "max_score": 0.41753215,
        "hits": [
            {
                "_index": "google_a804f89b-d32e-426a-a79a-ea83d65c98ea",
                "_type": "viz_dashlet",
                "_id": "/shared/Report_google_Shared",
                "_score": 0.41753215,
                "fields": {
                    "lastModified": [
                        1461738428007
                    ],
                    "dir": [
                        "/shared"
                    ],
                    "filename": [
                        "Report_google_Shared"
                    ]
                },
                "highlight": {
                    "filename": [
                        "Report_google_Shared"
                    ]
                }
            },
            {
                "_index": "google_a804f89b-d32e-426a-a79a-ea83d65c98ea",
                "_type": "viz_dashlet",
                "_id": "/shared/Report_Gmail_Shared",
                "_score": 0.41753215,
                "fields": {
                    "lastModified": [
                        1461738618676
                    ],
                    "dir": [
                        "/shared"
                    ],
                    "filename": [
                        "Report_Gmail_Shared"
                    ]
                },
                "highlight": {
                    "filename": [
                        "Report_Gmail_Shared"
                    ]
                }
            },
            {
                "_index": "google_a804f89b-d32e-426a-a79a-ea83d65c98ea",
                "_type": "viz_dashlet",
                "_id": "/private/hitesh/Report_Gmail_Private",
                "_score": 0.1883173,
                "fields": {
                    "lastModified": [
                        1461738629888
                    ],
                    "dir": [
                        "/private/hitesh"
                    ],
                    "filename": [
                        "Report_Gmail_Private"
                    ]
                },
                "highlight": {
                    "filename": [
                        "Report_Gmail_Private"
                    ]
                }
            },
            {
                "_index": "google_a804f89b-d32e-426a-a79a-ea83d65c98ea",
                "_type": "viz_dashlet",
                "_id": "/private/dholaria/Report_google_Private",
                "_score": 0.1883173,
                "fields": {
                    "lastModified": [
                        1461738451720
                    ],
                    "dir": [
                        "/private/dholaria"
                    ],
                    "filename": [
                        "Report_google_Private"
                    ]
                },
                "highlight": {
                    "filename": [
                        "Report_google_Private"
                    ]
                }
            }
        ]
    }
}

现在,我想根据下面的标准,根据特定的“dir”字段值过滤上述搜索结果。

在且仅在以下情况下将搜索结果包含在响应中:

  • 如果“dir”字段值等于“/shared”或“/private/hitesh”
  • 如果“dir”字段值以“/shared/”或“/private/hitesh/”开头,则为其他

如何在ElasticSearch中实现上述功能?


    {
        "google_a804f89b-d32e-426a-a79a-ea83d65c98ea": {
            "mappings": {
                "viz_dashlet": {
                    "properties": {
                        "charts": {
                            "type": "string",
                            "index_analyzer": "report_index_analyzer",
                            "search_analyzer": "report_search_analyzer",
                            "fields": {
                                "raw": {
                                    "type": "string",
                                    "index": "not_analyzed"
                                }
                            }
                        },
                        "columnLabels": {
                            "type": "string",
                            "index_analyzer": "report_index_analyzer",
                            "search_analyzer": "report_search_analyzer",
                            "fields": {
                                "raw": {
                                    "type": "string",
                                    "index": "not_analyzed"
                                }
                            }
                        },
                        "columnNames": {
                            "type": "string",
                            "index_analyzer": "report_index_analyzer",
                            "search_analyzer": "report_search_analyzer",
                            "fields": {
                                "raw": {
                                    "type": "string",
                                    "index": "not_analyzed"
                                }
                            }
                        },
                        "creator": {
                            "type": "string",
                            "index_analyzer": "report_index_analyzer",
                            "search_analyzer": "report_search_analyzer",
                            "fields": {
                                "raw": {
                                    "type": "string",
                                    "index": "not_analyzed"
                                }
                            }
                        },
                        "dimensions": {
                            "type": "string",
                            "index_analyzer": "report_index_analyzer",
                            "search_analyzer": "report_search_analyzer",
                            "fields": {
                                "raw": {
                                    "type": "string",
                                    "index": "not_analyzed"
                                }
                            }
                        },
                        "dir": {
                            "type": "string",
                            "index_analyzer": "report_index_analyzer",
                            "search_analyzer": "report_search_analyzer",
                            "fields": {
                                "raw": {
                                    "type": "string",
                                    "index": "not_analyzed"
                                }
                            }
                        },
                        "expressions": {
                            "type": "string",
                            "index_analyzer": "report_index_analyzer",
                            "search_analyzer": "report_search_analyzer",
                            "fields": {
                                "raw": {
                                    "type": "string",
                                    "index": "not_analyzed"
                                }
                            }
                        },
                        "filename": {
                            "type": "string",
                            "index_analyzer": "whitespace_index",
                            "search_analyzer": "whitespace_search",
                            "fields": {
                                "raw": {
                                    "type": "string",
                                    "index": "not_analyzed"
                                }
                            }
                        },
                        "lastModified": {
                            "type": "date",
                            "format": "date_hour_minute_second"
                        },
                        "measures": {
                            "type": "string",
                            "index_analyzer": "report_index_analyzer",
                            "search_analyzer": "report_search_analyzer",
                            "fields": {
                                "raw": {
                                    "type": "string",
                                    "index": "not_analyzed"
                                }
                            }
                        },
                        "promptFilters": {
                            "type": "string",
                            "index_analyzer": "report_index_analyzer",
                            "search_analyzer": "report_search_analyzer",
                            "fields": {
                                "raw": {
                                    "type": "string",
                                    "index": "not_analyzed"
                                }
                            }
                        }
                    }
                }
            }
        }
    }

共有1个答案

呼延学
2023-03-14

请尝试此查询:

{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "dir.raw": {
              "value": "/shared"
            }
          }
        },
        {
          "term": {
            "dir.raw": {
              "value": "/private/hitesh"
            }
          }
        },
        {
          "match_phrase_prefix": {
            "dir.raw": "/shared"
          }
        },
        {
          "match_phrase_prefix": {
            "dir.raw": "/private/hitesh"
          }
        }
      ]
    }
  }
}
 类似资料:
  • 可以对搜索结果进行过滤,只显示包含特定字段值的文档。也可以创建否定过滤器,排除包含特定字段值的文档。 从 Fields 表或 Documents 表中选择要添加的字段过滤器。除了可以创建积极字段和消极过滤器外,Documents 表还可以过滤某一字段是否存在。使用过的过滤器会在 Query 栏下方显示。消极过滤器用红色显示。 从 Fields 列表中添加一个过滤器: 点击想要过滤的字段名。这里显示

  • 我们的表有一个嵌套的映射角色,如下所示: 现在我要查找组123中在Department1中有角色的所有文档。如何基于嵌套映射的值字段进行筛选?类似于: 我知道如何通过嵌套对象键进行筛选,但无法找到通过“对象值”进行筛选。

  • 问题内容: 我正在使用Elasticsearch 6.6,尝试根据在日期范围内传递给查询(Bool)的多个值(email_address)提取多个结果/记录。例如:我想根据他们的email_address(annie@test.com,charles@test.com,heman@test.com)以及时期(即project_date(2019-01-01))提取有关少数雇员的信息。 我确实使用了

  • 我试图通过根据场值提升_score来摆脱弹性搜索中的排序。这是我的场景: 我的文档中有一个字段:应用日期。这是自EPOC以来经过的时间。我希望具有更大应用日期(最近)的记录具有更高的分数。 如果两个文档的分数相同,我想在另一个字符串类型的字段上对它们进行排序。说“状态”是另一个可以有值的字段(可用、进行中、关闭)。所以,具有相同应用程序日期的文档应该根据状态_score。可用应该有更多的分数,进行

  • 问题内容: 我希望能够查询文本,但也只能检索数据中某个整数字段的最大值的结果。我已经阅读了有关聚合和过滤器的文档,但我不太清楚自己在寻找什么。 例如,我有一些重复的数据得到索引,除了整数字段外,这些数据都是相同的-我们称这个字段为。 因此,作为示例,给定将这些数据放入elasticsearch中: 如果我查询 我会得到4个结果。我想要一个过滤器,这样我只能得到两个结果-仅包含具有最大字段的项目。

  • 问题内容: 我有一个字典列表和每个字典的key(比方说)“型”,这可以有值,等我的目标是过滤掉这些字典到同一个字典列表,但只有一个的那些某些“类型”。我想我真的很在理解问题。 因此,示例列表如下所示: 我有一个键值列表。举例来说: 预期的结果列表如下所示: 我知道我可以用一组for循环来做到这一点。我知道必须有一个更简单的方法。我发现此问题有很多不同的风格,但没有一个完全符合要求并回答了这个问题。