问题描述:
有一个ES实体为,文章标签tags,以字符串形式储存,如“上海,民宿,迪士尼,happy”为一条数据。在实现文章标签搜索排序(使用elasticsearch2.4.4+springbootdata+jpa)时,遇到问题,显示的标签 汉字部分被分词成了一个字一个字,英文还是一个单词。
因此寻找方法改变分词方法,有两种办法,第一种,使用中文分词器插件,使它分词起来更加友好,大部分词语能够正常被分词,但是一些不常用的词语,还是被分成了一个字一个字,比如“民宿”,被分词成了“民宿”、“民”、“宿”,这是不合理的,也不符合我们实际应用。因此,跟据人的使用的习惯,按照用户,主动划分的结果,作为分词结果,其实就是第二种,按照逗号分词,不要有其他操作。
一、用ik分词器分词
两种方法:
方法1:推荐方法
1、在springboot工程中建立实体类索引时,通过@Mapping注解,来自定义生成mapping。建立实体类时在@Document注解下面加入以下代码
@Mapping(mappingPath = "articlesearch_mapping.json")
结果如下图 :
2、在resources目录下,新建articlesearch_mapping.json
内容如下:设置tags标签分词和查找方法用 ik_smart
{
"blog": {
"properties": {
"tags": {
"type": "string",
"analyzer": "ik_smart",
"search_analyzer": "smart"
}
}
}
}
3、重新运行,在es-head中,查看索引信息,发现已经设置成功。显示了我们上述json文件中的内容。
方法2:
为了避免,每次建立实体就要加@Mapping注解,也可以用设置es索引模板的方法。但是这对于每次都会清es data的我就不是很方便了,每次都要新建模板,就很麻烦,所以我没有采用,但是效果是一样的。
postman(模拟器)中输入语句 (_template是新建模板操作,template1自己起的模板名字)
PUT http://localhost:9200/_template/template1
{
"template": "bl*",
"settings": {
"number_of_shards": 1
},
"mappings": {
"type1": {
"_source": {
"enabled": false
},
"properties": {
"tags": {
"type": "string",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
}
}
}
}
}
说明: (1)模板template_1匹配所有的以bl开头的索引。也可设置别的名字开头,如te*
(2)索引模板是template_1,索引是bl*。
(3)创建模版后 tags字段有效
二、 按照逗号分词
非常类似上面ik分词器的法1
1、在springboot工程中建立实体类索引时,通过@Setting和@Mapping 注解,来自定义设置setting 和 mapping。建立实体类时在@Document注解下面加入以下代码
@Setting(settingPath ="articlesearch_mapping2.json" )
@Mapping(mappingPath = "articlesearch_mapping.json")
结果如下:
2、在resources目录下,新建articlesearch_mapping2.json
内容如下:新建一个分词方法,名称为comma,使用逗号分词
{
"analysis": {
"analyzer": {
"comma": {
"type": "pattern",
"pattern":","
}
}
}
}
3、在resources目录下,新建articlesearch_mapping.json
内容如下:设置tags标签分词和查找方法用 新建的 comma方法
{
"blog": {
"properties": {
"tags": {
"type": "string",
"analyzer": "comma",
"search_analyzer": "comma"
}
}
}
}
参考:
https://my.oschina.net/apdplat/blog/628889
如有不对的地方,望大神指正。