一、自定义拼音分词器
settings是一个配置集合,里面的analyzer就是分词器的集合,my_analyzer是给分词器集合的命名,tokenizer是中文分词器,"filter": "py"是自己命名为py的过滤器,具体的filter看下面的配置,其中"type": "pinyin"是配置了这个过滤器是拼音分词器,keep_full_pinyin是否使用单个文字的拼音(狮子->shi,zi),keep_joined_full_pinyin是否使用中文分词之后的拼音(狮子->shizi),keep_original是否保留中文。
注意:创建索引分词的时候用my_analyzer,但是搜索分词的时候不能用拼音搜索了,因为一组词的拼音会出现很多词组,如狮子的拼音是shizi,但是虱子的拼音也是shizi,当搜索狮子的时候会根据shizi的拼音也把包含虱子的字样一起搜索出来。
1.1创建test索引库
PUT /test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "ik_max_word",
"filter": "py"
}
},
"filter": {
"py": {
"type": "pinyin",
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_original": true,
"limit_first_letter_length": 16,
"remove_duplicated_term": true,
"none_chinese_pinyin_tokenize": false
}
}
}
},
"mappings": {
"properties": {
"name":{
"type": "text",
"analyzer": "my_analyzer",
"search_analyzer": "ik_smart"
}
}
}
}
1.2为上面的索引库添加数据:
POST /test/_doc/1
{
"id": 1,
"name": "狮子"
}
POST /test/_doc/2
{
"id": 2,
"name": "虱子"
}
1.3搜索shizi的拼音进行测试
GET /test/_search
{
"query": {
"match": {
"name": "shizi"
}
}
}
1.4测试结果
二、自动补全功能的实现
2.1创建索引库,注意:补全的字段必须是completion类型
PUT test2
{
"mappings": {
"properties": {
"title":{
"type": "completion"
}
}
}
}
2.2示例数据,注意:想要补全的字段是多词条数组
POST test2/_doc
{
"title": ["Sony", "WH-1000XM3"]
}
POST test2/_doc
{
"title": ["SK-II", "PITERA"]
}
POST test2/_doc
{
"title": ["Nintendo", "switch"]
}
2.3自动补全查询
text:搜索关键字
field:补全字段
skip_duplicates:是否跳过重复的
size:获取前10条结果,搜索出来的结果以text显示在最顶
POST /test2/_search
{
"suggest": {
"title_suggest": {
"text": "s",
"completion": {
"field": "title",
"skip_duplicates": true,
"size": 10
}
}
}
}
2.4搜索结果
凡是词组里面是S开头的都被搜索出来了