获取整个索引中的所有类似文档

wfypjpf4  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(374)

是否有方法查找与查询匹配但查询没有特定值的文档。
例如,我有索引 person 使用Map:

{
  "properties": {
    "fullname": {
      "type": "text"
    },
    "email": {
      "type": "keyword"
    }
  }
}

我有一个问题想找到类似的人:

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "fullname": "Foo Bar"
                    }
                },
                {
                    "term": {
                        "email": "foobar@gmail.com"
                    }
                }
            ]
        }
    }
}

它可以为特定的人找到相似的人。
有没有一种方法可以让所有相似的人在索引中互相联系?也许是某种聚合?当出现新的类似文档时,设置警报可能会有所帮助。

v8wbuo2f

v8wbuo2f1#

首先,定义什么是相似的是任意的——但是您可能需要研究模糊匹配查询。
其次,当您使用 termkeyword 字段中,您的结果将仅限于精确匹配--这在一定程度上违背了相似人员的目的。
最后,聚合操作的是具体的值,所以一旦你发现你的相似的人使用 match 查询时,您可以通过多种方式进行聚合,但您已经“丢失”了模糊性方面,这是正确的。
旁注:当您打算在文本字段上聚合时,如 fullname ,您可以设置 fielddata: true 或者用 keyword 像这样Map:

...
"fullname": {
  "type": "text",
  "fields": {
    "keyword": {
      "type": "keyword"
    }
  }
}
...

具体来说,那么,在 term 查询时,我们可以进行以下操作:

GET similar/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "fullname": "Foo Bar"
          }
        }
      ]
    }
  },
  "aggs": {
    "by_email": {
      "terms": {
        "field": "email"
      }
    },
    "by_name": {
      "terms": {
        "field": "fullname.keyword"
      },
      "aggs": {
        "by_email": {
          "terms": {
            "field": "email"
          }
        }
      }
    }
  }
}

这个 by_email 聚合为我们提供与匹配查询的人员相关联的前10封电子邮件,按这些电子邮件的出现次数排序。我怀疑这不会有帮助,因为电子邮件。。。唯一;)
这个 by_name 聚合更有用——可能有很多人被称为“foobar”,子聚合也被称为 by_email 会给你他们的电子邮件。
提醒是一个完全不同的主题——请随意问另一个问题。

相关问题