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

时间:2018-12-20 09:03:28

标签: elasticsearch n-gram

我是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"
}

我想设计一个分析器并搜索查询,以便搜索:

  • “ ben”匹配所有三个(很简单)
  • “本·卡尔”与#1和#2匹配
  • “卡尔·本”也匹配#1和#2
  • “ benj carl”仅匹配#1(考虑到ngram分词器似乎起作用的方式,它不像我之前想象的那样自然地跟随前者)
  • “卡尔特·本”仅匹配#2(相同)
  • “ benj carlt”将没有匹配项
  • “ 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)。

关于我需要如何更改分析仪和/或查询以获得上述结果的任何想法?

0 个答案:

没有答案