elasticsearch-跨多个字段的部分匹配

fd3cxomn  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(0)|浏览(241)

我对elasticsearch还比较陌生,正致力于在多个领域获得部分匹配。例如,假设我索引了以下三个文档:

{
    "document-id": "Patient1",
    "document-type": "patients",
    "firstName": "Benjamin",
    "lastName": "Carlton",
    "medicalRecordNumber": "111-222-3333"
}
{
    "document-id": "Patient2",
    "document-type": "patients",
    "firstName": "Carly",
    "lastName": "Benson",
    "medicalRecordNumber": "111-222-3334"
}
{
    "document-id": "Patient3",
    "document-type": "patients",
    "firstName": "Jason",
    "lastName": "Benson",
    "medicalRecordNumber": "111-222-3335"
}

我想设计一个分析器和搜索查询,以便搜索:
“本”三个字都匹配(很简单)
“本卡尔”匹配1和2
“卡尔本”也匹配1和2
“benj carl”只匹配#1(考虑到ngram标记器的工作方式,它不像我想象的那样自然地遵循前面的那些)
“carlt ben”只匹配2(相同)
“本杰·卡尔特”不会有对手
“111-222-3334”仅匹配#2
我觉得我很接近,使用以下分析仪:

{
    "settings": {
        "analysis": {
            "tokenizer": {
                "partialMatchTokenizer": {
                    "type": "edge_ngram",
                    "min_gram": 2,
                    "max_gram": 10
                }
            },
            "analyzer": {
                "partialMatchAnalyzer": {
                    "type": "custom",
                    "tokenizer": "partialMatchTokenizer",
                    "char_filter": [],
                    "filter": [
                        "lowercase"
                    ]
                }
            }
        }
    },
    "mappings": {
        "_doc": {
            "properties": {
                "lastName": {
                    "type": "text",
                    "analyzer": "partialMatchAnalyzer"
                },
                "firstName": {
                    "type": "text",
                    "analyzer": "partialMatchAnalyzer"
                }
            }
        }
    }
}

以及以下查询:

{
    "query": {
        "multi_match": {
            "query": "carlt ben",
            "type": "cross_fields",
            "fields": [
                "firstName",
                "lastName",
                "medicalRecordNumber"
            ],
            "operator": "or"
        }
    }
}

但还不太清楚。“或”似乎过于放纵;一个“和”似乎太严格了。有时n-gram匹配似乎提供了意想不到的结果。例如,上面的查询(“carlt-ben”)同时匹配#1和#2(即,“carlt”匹配“carly”,可能是因为“carl”n-gram匹配)。另外,奇怪的是,“carlt-ben”和“ben-carlt”提供了两种不同的结果集(#1&#2与#1&#2&#3)。
关于如何更改分析器和/或查询以获得上述结果,有什么想法吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题