是时候用 ES 拯救发际线啦

拼音分词问题

Elasticsearch | 作者 hellosearch | 发布于2017年03月24日 | 阅读数:7362

我一开始参考这个帖子:拼音搜索+中文搜索  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"
        }
      }
    }
  }
}'
 
请问怎么实现上述拼音搜索中的第四和第五条 规则呢 ?
谢谢~~~
 
已邀请:

medcl - 今晚打老虎。

赞同来自:

上面参照的例子在5.0之后,配置文件已经不一样了。

hellosearch

赞同来自:

自己给自己回复一个吧,供其他刚开始学习elasticsearch 的人参考
以下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"
        }
      }
    }
  }
}'

要回复问题请先登录注册