我一开始参考这个帖子:拼音搜索+中文搜索 http://elasticsearch.cn/question/407
需求在他的基础上有所增加(增加了拼音搜索中的第4和5条),重新描述一下:
项目中对视频名称进行搜索,需要支持拼音+中文搜索两种方式,请教应该如何填写搜索配置,样例数据如下:
全部数据:刘德华、刘斌、张三、李四、刘德志
中文搜索:
1、搜索“刘”,匹配到“刘德华”、“刘斌”、“刘德志”
2、搜索“刘德”,匹配到“刘德华”、“刘德志”
3、搜索“德华”,匹配到“刘德华”
小结:搜索的文字需要匹配到集合中所有名字的子集。
拼音搜索:
1、搜索“liu”,匹配到“刘德华”、“刘斌”、“刘德志”
2、搜索“liude”,匹配到“刘德华”、“刘德”
3、搜索“liudehua”或“ldh”,匹配到“刘德华”
4、搜索 "l" , 匹配到 刘德华”、“刘斌”、“刘德志”
5、搜索 'ld', 匹配到 刘德华”、刘德志”
小结:搜索的文字转换成拼音后,需要匹配到集合中所有名字转成拼音后的子集
目前的情况是除了拼音搜索当中的第4和5条外,其他的都可以满足条件:
我的ES 版本是5.1.1,使用的分词IK和pinyin,版本也是5.1.1,mapping 配置如下:
curl -XPUT "http://localhost:9200/medcl/" -d'
{
"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":""
}
}
}
}
}'
curl -XPOST http://localhost:9200/medcl/folks/_mapping -d '
{
"properties": {
"name":{
"type": "string",
"analyzer": "ik_max_word",
"fields": {
"pinyin":{
"type": "string",
"analyzer": "ngram_pinyin_analyzer"
}, "full_pinyin":{
"type": "string",
"analyzer": "my_pinyin_analyzer"
},"first_letter":{
"type": "string",
"analyzer": "pinyin"
}
}
}
}
}'
请问怎么实现上述拼音搜索中的第四和第五条 规则呢 ?
谢谢~~~
需求在他的基础上有所增加(增加了拼音搜索中的第4和5条),重新描述一下:
项目中对视频名称进行搜索,需要支持拼音+中文搜索两种方式,请教应该如何填写搜索配置,样例数据如下:
全部数据:刘德华、刘斌、张三、李四、刘德志
中文搜索:
1、搜索“刘”,匹配到“刘德华”、“刘斌”、“刘德志”
2、搜索“刘德”,匹配到“刘德华”、“刘德志”
3、搜索“德华”,匹配到“刘德华”
小结:搜索的文字需要匹配到集合中所有名字的子集。
拼音搜索:
1、搜索“liu”,匹配到“刘德华”、“刘斌”、“刘德志”
2、搜索“liude”,匹配到“刘德华”、“刘德”
3、搜索“liudehua”或“ldh”,匹配到“刘德华”
4、搜索 "l" , 匹配到 刘德华”、“刘斌”、“刘德志”
5、搜索 'ld', 匹配到 刘德华”、刘德志”
小结:搜索的文字转换成拼音后,需要匹配到集合中所有名字转成拼音后的子集
目前的情况是除了拼音搜索当中的第4和5条外,其他的都可以满足条件:
我的ES 版本是5.1.1,使用的分词IK和pinyin,版本也是5.1.1,mapping 配置如下:
curl -XPUT "http://localhost:9200/medcl/" -d'
{
"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":""
}
}
}
}
}'
curl -XPOST http://localhost:9200/medcl/folks/_mapping -d '
{
"properties": {
"name":{
"type": "string",
"analyzer": "ik_max_word",
"fields": {
"pinyin":{
"type": "string",
"analyzer": "ngram_pinyin_analyzer"
}, "full_pinyin":{
"type": "string",
"analyzer": "my_pinyin_analyzer"
},"first_letter":{
"type": "string",
"analyzer": "pinyin"
}
}
}
}
}'
请问怎么实现上述拼音搜索中的第四和第五条 规则呢 ?
谢谢~~~
2 个回复
medcl - 今晚打老虎。
赞同来自:
hellosearch
赞同来自:
以下mapping 配置在 es5.1.1/IK5.1.1/pinyin5.1.1 下测试的没什么问题,可以满足自己的需求~~~
curl -XPUT "http://localhost:9200/medcl/" -d'
{
"index" : {
"analysis" : {
"analyzer" : {
"my_pinyin_analyzer" : {
"tokenizer" : "keyword",
"filter" : ["full_pinyin_no_space","my_edge_ngram_tokenizer","word_delimiter","shingle","remove_whitespace"]
}
},
"filter" :{
"full_pinyin_no_space" : {
"type" : "pinyin",
"first_letter" : "prefix",
"padding_char" : ""
},"my_edge_ngram_tokenizer" : {
"type" : "edge_ngram",
"min_gram" : "1",
"max_gram" : "6",
"token_chars": [ "letter", "digit" ]
},"remove_whitespace": {
"type": "pattern_replace",
"pattern": "\\s+",
"replacement":""
}
}
}
}
}'
curl -XPOST http://localhost:9200/medcl/folks/_mapping -d '
{
"properties": {
"name":{
"type": "string",
"analyzer": "ik_max_word",
"fields": {
"pinyin":{
"type": "string",
"analyzer": "my_pinyin_analyzer"
}
}
}
}
}'