1. 常见问题
1.1. 批量同步数据?
通过读取数据再迭代调用Service进行保存操作
@Autowired
private IESContentService esContentService;
/**
* 同步es文章
* @return
*/
@PostMapping("/sync")
@RequiresPermissions("es:sync")
@ResponseBody
public ResultData sync() {
// 没有索引需要先去创建索引
if (!esService.existDoc(esService.getBeanClass())){
return ResultData.build().error("当前不存在es索引,请先创建es索引");
}
// 获取栏目列表
LambdaQueryWrapper<CategoryEntity> categoryWrapper = new LambdaQueryWrapper<>();
categoryWrapper.eq(CategoryEntity::getCategoryType, CategoryTypeEnum.LIST.toString());
List<CategoryEntity> categoryList = categoryBiz.list(categoryWrapper);
for (CategoryEntity category : categoryList) {
// 获取文章列表
LambdaQueryWrapper<ContentEntity> contentWrapper = new LambdaQueryWrapper<>();
contentWrapper.eq(ContentEntity::getCategoryId, category.getId());
List<ContentEntity> contentList = contentBiz.list(contentWrapper);
boolean hasModel = false;
ModelEntity model = null;
if (category.getMdiyModelId() != null) {
hasModel = true;
// 获取模型实体
model = modelBiz.getById(category.getMdiyModelId());
}
for (ContentEntity content : contentList) {
ESContentBean esContentBean = new ESContentBean();
ESContentBeanUtil.fixESContentBean(esContentBean, content, category);
esContentBean.setId(content.getId());
//将需要同步到es库的字段逐个赋值
esContentBean.setTitle(content.getContentTitle());
esContentBean.setContent(content.getContentDetails());
esContentBean.setAuthor(content.getContentAuthor());
esContentBean.setDate(content.getContentDatetime());
esContentBean.setTypeId(content.getCategoryId());
esContentBean.setDescrip(content.getContentDescription());
esContentBean.setSort(content.getContentSort());
esContentBean.setLitPic(content.getContentImg());
esContentBean.setFlag(content.getContentType());
esContentBean.setUrl(category.getCategoryPath()
try {
esContentService.save(esContentBean);
}catch (DataAccessResourceFailureException e) {
return ResultData.build().error("未找到当前ES信息,请检查当前ES链接是否正常");
}
}
}
return ResultData.build().success("全部同步完成!");
}
[!tip]
service保存时,如果已经存在的数据es则会进行更新操作
1.2. 怎么快速查看es?
通过http://ip:5601/app/dev_tools#/console,常用指令
#索引名:cms
#查询索引内所有数据
GET cms/_search?pretty
#查询索引内数据数量
GET cms/_count?pretty
#查询es索引mapping
GET cms/_mapping
#删除索引
DELETE cms
#查看分词内容
GET cms/_analyze
{
"field": "title",
"text": "快速查看es"
}
1.3. 提示createTime错误?
直接同步数据没有设定字段的数据结构从而给定了默认的text字段类型及默认结构,需先创建es索引再进行同步。 若已存在索引需删除重新创建
1.4. 搜索结果返回的等待时间过久
一般分为两种情况:
1.一直没有搜索结果返回,出现这种情况一般是服务端出错,需要结合日志进行排查,例如es服务器宕机情况。
2.等待很久才返回结果,出现这种情况一般是es服务的问题,可能是分词插件出错导致es无法正常提供检索服务。
1.5. es搜索返回500
- 系统设置》ES搜索设置中开启es
- ES引擎设置,先创建es库,再同步es库
1.6. es同步时出现报错 cluster_block_exception index has read-only-allow-delete block
这类问题通常是存储空间不够,索引自动变为只读只删,需要增加存储大小然后重启,如果硬盘足够就需要检查es数据存储目录,考虑修改配置文件
1.7. es同步报No qualifying bean of type 'net.mingsoft.gov.service.IESContentService' avaliable
yml中 设置spring.data.elasticsearch.repositories.enabled 为true
如果在MSApplication使用了@EnableElasticsearchRepositories,需要加上net.mingsoft.elasticsearch.service和net.mingsoft.gov.service
1.8. 用某个词搜索不出指定文章的情况
系统是对于搜索是默认粒度拆分,一些并未在分词库里的行业术语不会在搜索的时候被拆分出来进行匹配;
官方推荐了一种分词库录入词不足的解决方案,添加分词热更新配置,具体查看ik分词官方文档链接https://github.com/medcl/elasticsearch-analysis-ik#%E7%83%AD%E6%9B%B4%E6%96%B0-ik-%E5%88%86%E8%AF%8D%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95
1.9. 聚合搜索报错
异常信息如下
Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [interests] in order to load field data by uninverting the inverted index. Note that this can use significant memory
对text类型属性进行聚合,需要对字段设置成keyword;参考ESContentBean中typeId的字段
1.10. 聚合搜索结果结构说明
/cms/es/search/highlightSearch.do接口返回结果中的agg结构说明: "[父栏目id集合(参考category_parent_ids字段)]-[文章所属栏目id]-[文章所属栏目名称]": 文章所属栏目下相关文章数的统计
1.11. es安全设置
[!tip] 有问题可以通过评论方式提交,如果没有看到评论列表请尝试刷新页面