假设我有一个包含数千个客户名称的索引,我需要能够在管理面板中轻松搜索它们,如下所示:
John Anders
John Smith
Sarah Smith
Bjarne Stroustrup
我想拥有完整的搜索功能,这意味着:
如果我搜索John
,我应该获得John Anders
和John Smith
。
如果我搜索Smith
,我应该得到史密斯夫妇。
如果我搜索sarasmit
或sara smit
,我应该Sarah Smith
,因为我搜索了名称的缩写,而且空格并不重要。< / p>
如果我搜索johers
或joh ers
,我会在搜索名称中包含的字符串时获得John Anders
。
我已经发现我可以使用带有小写过滤器和关键字标记器的分析器,但它们不适用于每种情况。
要使用的令牌化器/分析器/查询的正确组合是什么?
答案 0 :(得分:0)
看一下this,这是一个我问过类似数据集的问题。下面是我用来产生一些不错结果的索引设置/映射。在过渡期间,发展已经停止,但这是我迄今为止所制作的。然后,您可以开发查询 -
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 0,
"analysis": {
"filter": {
"synonym": {
"type": "synonym",
"synonyms_path": "synonyms/synonyms.txt"
},
"my_metaphone": {
"type": "phonetic",
"encoder": "metaphone",
"replace": false
}
},
"analyzer": {
"synonym": {
"tokenizer": "whitespace",
"filter": [
"lowercase",
"synonym"
]
},
"metaphone": {
"tokenizer": "standard",
"filter": [
"my_metaphone"
]
},
"porter": {
"tokenizer": "standard",
"filter": [
"lowercase",
"porter_stem"
]
}
}
}
},
"mappings": {
"mes": {
"_all": {
"enabled": false
},
"properties": {
"pty_forename": {
"type": "multi_field",
"store": "yes",
"fields": {
"pty_forename": {
"type": "string",
"analyzer": "simple"
},
"metaphone": {
"type": "string",
"analyzer": "metaphone"
},
"porter": {
"type": "string",
"analyzer": "porter"
},
"synonym": {
"type": "string",
"analyzer": "synonym"
}
}
},
"pty_full_name": {
"type": "string",
"index": "not_analyzed",
"store": "yes"
},
"pty_surname": {
"type": "multi_field",
"store": "yes",
"fields": {
"pty_surname": {
"type": "string",
"analyzer": "simple"
},
"metaphone": {
"type": "string",
"analyzer": "metaphone"
},
"porter": {
"type": "string",
"analyzer": "porter"
},
"synonym": {
"type": "string",
"analyzer": "synonym"
}
}
}
}
}
}
}'
注意我已经使用了拼音插件,而且我还有一个完整的同义词列表,这对于在输入richard
时返回dick
的结果至关重要。