我正在建立一个搜索数据库。大多数条目都是专有名词(名称和街道地址)。我设置了一个ngram令牌过滤器来帮助快速模糊搜索。它运作良好。但是,如果我搜索“约翰·艾伦”,则结果包括得分相同(即相关性排名)的“约翰·艾伦”和“约翰·艾伦”。当我搜索“约翰·艾伦”时,如何调整索引设置或查询语法以使弹性仍然返回两个文档,但是给“约翰·艾伦”分配的得分要比“约翰·艾伦·约翰”的得分高?]
这里是索引设置...
{
"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": {
"full_name": {
"type": "text",
"analyzer": "my_analyzer",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
这是示例查询...
{
"query": {
"query_string": {
"query": "Allen John",
"fields": [
"full_name"
]
}
}
}
[其他说明:
我们可以再添加一个使用标准分析器的字段,如果查询字符串与该字段匹配,那么我们可以使用更高的值进行增强,如果不匹配,则通过ngram分析器获得匹配的分数。
"mappings": {
"properties": {
"full_name": {
"type": "text",
"analyzer": "my_analyzer",
"fields": {
"keyword": {
"type": "keyword"
},
"standard" :{
"type": "text" //this field uses default standard analyzer
}
}
}
}
搜索查询应更改为包括两个字段,其中两个字段具有更高的提升值。
{
"query": {
"query_string": {
"query": "Allen John",
"fields": [
"full_name", "full_name.standard^2"
]
}
}
}