Elasticsearch:按字段查找重复项

时间:2018-09-26 12:01:46

标签: elasticsearch

我正在与Elasticsearch合作。我收集了一些事件,例如,事件名称在哪里。 FC Barcelona - Real Madrit,那么集合中的某个地方可能是Footbal Club Barcela - FC Real Madryt

我需要找到至少2个不包含查询文字的匹配。我认为应该在此处使用聚合和ngram标记器,但是我不确定。

这是我的索引设置:

{
        "settings": {
            "analysis": {
                "analyzer": {
                    "test": {
                        "tokenizer": "test",
                        "filter": ["lowercase", "word_delimiter", "nGram", "porter_stem"]
                        "token_chars": [
                            "letter",
                            "digit",
                            "whitespace"
                        ]
                    }
                },
                "tokenizer": {
                    "test": {
                        "type": "ngram",
                        "min_gram": 3,
                        "max_gram": 15,
                    }
                }
            }
        }
    }

这就是我当前查询的样子:

{
  "size": 0,
  "aggs": {
    "duplicateNames": {
      "terms": {
        "field": "eventName",
        "min_doc_count": 2
      },
      "aggs": {
        "duplicateDocuments": {
          "top_hits": {}
        }
      }
    }
  }
}

这是我的映射:

{
            "event": {
                "properties": {
                    "eventName": {
                        "type": "keyword",
                        // fielddata: true
                    }
                }
            }
        }

能给我指出正确的方向吗?

1 个答案:

答案 0 :(得分:1)

如果要查找重复项,则不需要nGrams。您将希望像平常一样使用keyword类型。您可以像以前一样使用术语聚合。

POST <index_name>/event/_search
{
  "size": 0,
  "aggs": {
    "duplicateNames": {
      "terms": {
        "field": "eventName",
        "min_doc_count": 2
      },
      "aggs": {
        "duplicateDocuments": {
          "top_hits": {}
        }
      }
    }
  }
}

重复的eventName将在duplicateEventNames聚合存储桶中列出。文档_id将在每个存储桶的顶部hits中。