【问题标题】:How to get duplicate field values in elastic search by field name without knowing its value如何在不知道其值的情况下按字段名称在弹性搜索中获取重复的字段值
【发布时间】:2019-06-29 21:54:43
【问题描述】:

我在弹性搜索索引中有一个字段“EmployeeName” - 我想执行一个查询,该查询将返回所有“EmployeeName”值重复的情况。这个可以吗?

我找到了 more_like_this,但这需要“like_text”的字段值。 但我的要求是在不知道其价值的情况下获取名称重复的员工列表。

{
    "more_like_this" : {
        "fields" : ["EmployeeName"],
        "like_text" : "Mukesh",
        "min_term_freq" : 1,
        "max_query_terms" : 12
    }
}

提前致谢

问候 穆克什

【问题讨论】:

  • EmployeeName 的映射是什么样子的?是not_analyzed 还是带有not_analyzed 子字段的多字段?你能从这个意义上改变你的映射吗?如果是这种情况,请参阅下面的 @Jettro 评论,您可以使用 top_hits 子聚合来获取您的重复文档。
  • 感谢您在映射 EmployeeName is not_analyzed 中的回复,我也在聚合中得到了结果。现在我将尝试获取该结果的文档。再次感谢
  • HI Val,你能给我一个top_hits的例子吗?我尝试了这个,但在聚合下,我得到了重复名称的不同文档值,并在 top_hits 下得到了不同的文档。谢谢

标签: elasticsearch


【解决方案1】:

您可以为此使用Terms Aggregation

POST <index>/<type>/_search?search_type=count
{
    "aggs": {
        "duplicateNames": {
            "terms": {
                "field": "EmployeeName",
                "size": 0,
                "min_doc_count": 2
            }
        }
    }
}

这将返回至少出现在 2 个文档中的字段 EmployeeName 的所有值。

【讨论】:

  • 不会的。 "min_doc_count": 2 确保它返回重复的值。在 JSON 响应中,您需要查看 "aggregations" 对象而不是 "hits" 对象中的值。
  • 另请注意,1)此方法仅在您的映射中 EmployeeNamenot_analyzed 时有效,并且 2)您不会知道哪些文档是重复的,只是存在重复。
  • 我同意@Val 的观点,您可以使用热门点击聚合作为术语聚合的子聚合。这样就可以退回文件了。
  • 感谢回复 是的,您是对的。我在聚合下得到了正确的结果。现在,我将尝试使用热门歌曲来获取该结果的文档。谢谢
  • 嗨 Jettro,你能给我一个 top_hits 的例子吗?我尝试了这个,但在聚合下,我得到了重复名称的不同文档值,并在 top_hits 下得到了不同的文档。谢谢
【解决方案2】:

这将是当前 Elasticsearch 版本的查询:

GET <index>/_search
{
  "size": 0,
  "aggs": {
    "duplicateNames": {
       "terms": {
         "field": "EmployeeName",
         "min_doc_count": 2
       }
     }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-08
    • 2020-07-26
    相关资源
    最近更新 更多