此问题与Val回答的我的其他问题enter link description here相似。区别在于,在这个问题中,我感兴趣的是搜索与文档中的单词完全匹配的查询。例如,我想搜索不带“ e”的“ Ann”来带回Anne Borg,Anne M Stone和Leanne Ray,但给Leanne Ray比其他两个文档更低的分数。 [请注意,在另一个问题中,我正在搜索“ Anne”,它与文档中的字符串完全匹配。在这里,我正在搜索“ Ann”,这不是完全匹配。我有一个包含3个文档的索引。
{
"firstname": "Anne",
"lastname": "Borg",
}
{
"firstname": "Leanne",
"lastname": "Ray"
},
{
"firstname": "Anne",
"middlename": "M",
"lastname": "Stone"
}
[当我搜索“ Ann”时,我希望Elastic返回所有这3个文档(因为它们都在一定程度上与“ Anne”相匹配)。但是,我希望Leanne Ray的得分(相关性排名)较低,因为搜索词“ Ann”在此文档中的出现位置要比其他两个文档中的出现要晚。
这是我的索引设置...
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"filter": [
"lowercase"
],
"type": "custom",
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"token_chars": [
"letter",
"digit",
"custom"
],
"custom_token_chars": "'-",
"min_gram": "3",
"type": "ngram",
"max_gram": "4"
}
}
}
},
"mappings": {
"properties": {
"firstname": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
},
"copy_to": [
"full_name"
]
},
"lastname": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
},
"copy_to": [
"full_name"
]
},
"middlename": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
},
"copy_to": [
"full_name"
]
},
"full_name": {
"type": "text",
"analyzer": "my_analyzer",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
这里是Val的查询,可以成功回答我以前的问题...
{
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "Anne",
"fields": [
"full_name"
]
}
}
],
"should": [
{
"multi_match": {
"query": "Anne",
"fields": [
"firstname",
"lastname"
],
"boost": 10
}
}
]
}
}
}
同时使用ngram令牌过滤器和ngram令牌生成器似乎很好地满足了这一挑战...
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"filter": [
"ngram"
],
"tokenizer": "ngram"
}
}
}
},
"mappings": {
"properties": {
"firstname": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
},
"copy_to": [
"full_name"
]
},
"lastname": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
},
"copy_to": [
"full_name"
]
},
"middlename": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
},
"copy_to": [
"full_name"
]
},
"full_name": {
"type": "text",
"analyzer": "my_analyzer",
"search_analyzer": "my_analyzer"
}
}
}
}
但是,查询还会带回大量根本不匹配查询的误报结果。相对于预期匹配的分数,这些误报具有非常低的分数是很有帮助的。
此问题与我的其他问题类似,Val在此处输入了链接描述。区别在于,在此问题中,我感兴趣的是搜索不完全相同的查询...
Ann
的工作方式与与Anne
的工作方式相同,不过您会获得完全相同的响应(请参见下文),但得分不同: