我正在与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
}
}
}
}
能给我指出正确的方向吗?
答案 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
中。