【发布时间】:2021-05-24 10:48:43
【问题描述】:
目前,我正在使用 Ngram 标记器对员工进行部分匹配。
我可以匹配全名、电子邮件地址和员工编号
我当前的设置如下:
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 3,
"token_chars": [
"letter",
"digit"
]
}
}
我面临的问题是 Employee Number 可以是 1 个字符长,并且由于 min_gram 和 max_gram,我永远不能匹配。我也无法将 min_gram 设为 1,因为结果看起来不正确。
所以我尝试将 Ngram 与标准标记器混合,而不是在 Multimatch 搜索中进行,而是在做 simple_query_string。
这似乎也部分起作用。
我的问题是如何在所有 3 个字段上进行部分匹配,记住员工编号可以是 1 或 2 个字符长。如果我在单词或数字周围使用半引号,则完全匹配
在下面的示例中,如何搜索 11 并返回文档 4 和 5? 另外,如果我必须搜索部分匹配的 706,我希望返回文档 2,但如果我必须使用“7061”进行搜索,我只会返回文档 2
完整代码
PUT index
{
"settings": {
"analysis": {
"analyzer": {
"english_exact": {
"tokenizer": "standard",
"filter": [
"lowercase"
]
},
"my_analyzer": {
"filter": [
"lowercase",
"asciifolding"
],
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 3,
"token_chars": [
"letter",
"digit"
]
}
},
"normalizer": {
"lowersort": {
"type": "custom",
"filter": [
"lowercase"
]
}
}
}
},
"mappings": {
"properties": {
"number": {
"type": "text",
"analyzer": "english",
"fields": {
"exact": {
"type": "text",
"analyzer": "english_exact"
}
}
},
"fullName": {
"type": "text",
"fields": {
"ngram": {
"type": "text",
"analyzer": "my_analyzer"
}
},
"analyzer": "standard"
}
}
}
}
PUT index/_doc/1
{
"number" : 1,
"fullName": "Brenda eaton"
}
PUT index/_doc/2
{
"number" : 7061,
"fullName": "Bruce wayne"
}
PUT index/_doc/3
{
"number" : 23,
"fullName": "Bruce Banner"
}
PUT index/_doc/4
{
"number" : 111,
"fullName": "Cat woman"
}
PUT index/_doc/5
{
"number" : 1112,
"fullName": "0723568521"
}
GET index/_search
{
"query": {
"simple_query_string": {
"fields": [ "fullName.ngram", "number.exact"],
"query": "11"
}
}
}
【问题讨论】:
标签: elasticsearch n-gram