在 Mapping 里面,将 dynamic 参数设置成 strict 可以拒绝索引包含未知字段的文档。 此条 Tips 由 medcl 贡献。

拼音搜索+中文搜索

Elasticsearch | 作者 iceli | 发布于2016年03月28日 | 阅读数:22322

项目中对视频名称进行搜索,需要支持拼音+中文搜索两种方式,请教应该如何填写搜索配置,样例数据如下:
全部数据:刘德华、刘斌、张三、李四、刘德志
中文搜索:
1、搜索“刘”,匹配到“刘德华”、“刘斌”、“刘德志”
2、搜索“刘德”,匹配到“刘德华”、“刘德志”
3、搜索“德华”,匹配到“刘德华”
小结:搜索的文字需要匹配到集合中所有名字的子集。
拼音搜索:
1、搜索“liu”,匹配到“刘德华”、“刘斌”、“刘德志”
2、搜索“liude”,匹配到“刘德华”、“刘德”
3、搜索“liudehua”或“ldh”,匹配到“刘德华”
小结:搜索的文字转换成拼音后,需要匹配到集合中所有名字转成拼音后的子集
 
已邀请:

medcl - 今晚打老虎。

赞同来自: iceli cccthought

DELETE medcl1


PUT /medcl1/
{
"index" : {
"analysis" : {
"analyzer" : {
"ngram_pinyin_analyzer" : {
"tokenizer" : "keyword",
"filter" : ["full_pinyin_with_space","word_delimiter","shingle","remove_whitespace"]
}, "my_pinyin_analyzer" : {
"tokenizer" : "keyword",
"filter" : ["full_pinyin_no_space"]
}
},
"filter" :{
"full_pinyin_no_space" : {
"type" : "pinyin",
"first_letter" : "none",
"padding_char" : ""
},"full_pinyin_with_space" : {
"type" : "pinyin",
"first_letter" : "none",
"padding_char" : " "
},
"my_edge_ngram_tokenizer" : {
"type" : "edgeNGram",
"min_gram" : "2",
"max_gram" : "5",
"token_chars": [ "letter", "digit" ]
},
"remove_whitespace": {
"type": "pattern_replace",
"pattern": "\\s+",
"replacement":""
}
}
}
}
}

POST medcl1/type3/_mapping
{
"properties": {
"name1":{
"type": "multi_field",
"fields": {
"pinyin":{
"type": "string",
"analyzer": "ngram_pinyin_analyzer"
}, "full_pinyin":{
"type": "string",
"analyzer": "my_pinyin_analyzer"
},
"first_letter":{
"type": "string",
"analyzer": "pinyin_first_letter"
},
"name1":{
"type": "string",
"analyzer": "ik_max_word"
}
}
}
}
}

POST medcl1/type3/
{
"name1":"刘德华"
}
POST medcl1/type3/
{
"name1":"刘斌"
}
POST medcl1/type3/
{
"name1":"张三"
}
POST medcl1/type3/
{
"name1":"李四"
}
POST medcl1/type3/
{
"name1":"刘德志"
}

POST medcl1/_search?size=50
{
"query": {
"query_string": {
"fields": ["name1","name1.full_pinyin","name1.pinyin","name1.first_letter"],
"query": "你的测试条件",
"default_operator": "AND"
}
}
}
看看这个是不是你要的?

helloes

赞同来自:

这就是全部需求吗?如果是的话,那么completion suggester很适合你

iceli - 85后IT男

赞同来自:

是的,很好的解决了我的问题,谢谢medcl~!

zplzpl

赞同来自:

在这个基础上如何实现:
搜索"l"也可以召回刘德华
搜索"li"也可以召回刘德华、李四
但搜索"de"不需要召回,只需要前缀满足。

niweiyi1314

赞同来自:

支持拼音搜索是需要安装拼音插件吗

要回复问题请先登录注册