知识问答相关
This commit is contained in:
parent
40f773f8b6
commit
de5ca49409
@ -2,11 +2,19 @@ package com.stdiet.web.controller;
|
||||
|
||||
import com.stdiet.common.config.AliyunOSSConfig;
|
||||
import com.stdiet.common.utils.oss.AliyunOSSUtils;
|
||||
import com.stdiet.custom.domain.SysNutritionQuestion;
|
||||
import com.stdiet.custom.domain.SysWxUserInfo;
|
||||
import com.stdiet.custom.domain.SysWxUserLog;
|
||||
import com.stdiet.custom.mapper.SysCustomerPhysicalSignsMapper;
|
||||
import com.stdiet.custom.mapper.SysNutritionQuestionMapper;
|
||||
import com.stdiet.custom.mapper.SysWxUserInfoMapper;
|
||||
import com.stdiet.custom.mapper.SysWxUserLogMapper;
|
||||
import com.stdiet.custom.service.ISysNutritionQuestionService;
|
||||
import com.stdiet.custom.utils.LuceneIndexUtils;
|
||||
import com.stdiet.framework.web.domain.server.Sys;
|
||||
import org.apache.lucene.document.Document;
|
||||
import org.apache.lucene.document.Field;
|
||||
import org.apache.lucene.document.TextField;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.ApplicationArguments;
|
||||
import org.springframework.boot.ApplicationRunner;
|
||||
@ -26,9 +34,20 @@ public class MyApplicationRunner implements ApplicationRunner {
|
||||
@Autowired
|
||||
private SysWxUserInfoMapper sysWxUserInfoMapper;
|
||||
|
||||
@Autowired
|
||||
private ISysNutritionQuestionService sysNutritionQuestionService;
|
||||
|
||||
@Override
|
||||
public void run(ApplicationArguments args) throws Exception {
|
||||
System.out.println("项目启动调用方法");
|
||||
|
||||
/*SysNutritionQuestion sysNutritionQuestion = new SysNutritionQuestion();
|
||||
sysNutritionQuestion.setTitle("如何防止猝死");
|
||||
sysNutritionQuestion.setContent("少熬夜,少暴饮暴食");
|
||||
sysNutritionQuestion.setKey("猝死");
|
||||
sysNutritionQuestionService.insertSysNutritionQuestion(sysNutritionQuestion);*/
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -0,0 +1,103 @@
|
||||
package com.stdiet.custom.controller;
|
||||
|
||||
import java.util.List;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.PutMapping;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import com.stdiet.common.annotation.Log;
|
||||
import com.stdiet.common.core.controller.BaseController;
|
||||
import com.stdiet.common.core.domain.AjaxResult;
|
||||
import com.stdiet.common.enums.BusinessType;
|
||||
import com.stdiet.custom.domain.SysNutritionQuestion;
|
||||
import com.stdiet.custom.service.ISysNutritionQuestionService;
|
||||
import com.stdiet.common.utils.poi.ExcelUtil;
|
||||
import com.stdiet.common.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 营养知识小问答Controller
|
||||
*
|
||||
* @author xzj
|
||||
* @date 2021-04-13
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/custom/nutritionQuestion")
|
||||
public class SysNutritionQuestionController extends BaseController
|
||||
{
|
||||
@Autowired
|
||||
private ISysNutritionQuestionService sysNutritionQuestionService;
|
||||
|
||||
/**
|
||||
* 查询营养知识小问答列表
|
||||
*/
|
||||
@PreAuthorize("@ss.hasPermi('custom:nutritionQuestion:list')")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo list(SysNutritionQuestion sysNutritionQuestion)
|
||||
{
|
||||
startPage();
|
||||
List<SysNutritionQuestion> list = sysNutritionQuestionService.selectSysNutritionQuestionList(sysNutritionQuestion);
|
||||
return getDataTable(list);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出营养知识小问答列表
|
||||
*/
|
||||
@PreAuthorize("@ss.hasPermi('custom:nutritionQuestion:export')")
|
||||
@Log(title = "营养知识小问答", businessType = BusinessType.EXPORT)
|
||||
@GetMapping("/export")
|
||||
public AjaxResult export(SysNutritionQuestion sysNutritionQuestion)
|
||||
{
|
||||
List<SysNutritionQuestion> list = sysNutritionQuestionService.selectSysNutritionQuestionList(sysNutritionQuestion);
|
||||
ExcelUtil<SysNutritionQuestion> util = new ExcelUtil<SysNutritionQuestion>(SysNutritionQuestion.class);
|
||||
return util.exportExcel(list, "nutritionQuestion");
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取营养知识小问答详细信息
|
||||
*/
|
||||
@PreAuthorize("@ss.hasPermi('custom:nutritionQuestion:query')")
|
||||
@GetMapping(value = "/{id}")
|
||||
public AjaxResult getInfo(@PathVariable("id") Long id)
|
||||
{
|
||||
return AjaxResult.success(sysNutritionQuestionService.selectSysNutritionQuestionById(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增营养知识小问答
|
||||
*/
|
||||
@PreAuthorize("@ss.hasPermi('custom:nutritionQuestion:add')")
|
||||
@Log(title = "营养知识小问答", businessType = BusinessType.INSERT)
|
||||
@PostMapping
|
||||
public AjaxResult add(@RequestBody SysNutritionQuestion sysNutritionQuestion)
|
||||
{
|
||||
return toAjax(sysNutritionQuestionService.insertSysNutritionQuestion(sysNutritionQuestion));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改营养知识小问答
|
||||
*/
|
||||
@PreAuthorize("@ss.hasPermi('custom:nutritionQuestion:edit')")
|
||||
@Log(title = "营养知识小问答", businessType = BusinessType.UPDATE)
|
||||
@PutMapping
|
||||
public AjaxResult edit(@RequestBody SysNutritionQuestion sysNutritionQuestion)
|
||||
{
|
||||
return toAjax(sysNutritionQuestionService.updateSysNutritionQuestion(sysNutritionQuestion));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除营养知识小问答
|
||||
*/
|
||||
@PreAuthorize("@ss.hasPermi('custom:nutritionQuestion:remove')")
|
||||
@Log(title = "营养知识小问答", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{ids}")
|
||||
public AjaxResult remove(@PathVariable Long[] ids)
|
||||
{
|
||||
return toAjax(sysNutritionQuestionService.deleteSysNutritionQuestionByIds(ids));
|
||||
}
|
||||
}
|
@ -68,5 +68,37 @@
|
||||
<artifactId>lombok</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- lucene -->
|
||||
<dependency>
|
||||
<groupId>org.apache.lucene</groupId>
|
||||
<artifactId>lucene-core</artifactId>
|
||||
<version>4.4.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.lucene</groupId>
|
||||
<artifactId>lucene-queryparser</artifactId>
|
||||
<version>4.4.0</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-common -->
|
||||
<dependency>
|
||||
<groupId>org.apache.lucene</groupId>
|
||||
<artifactId>lucene-analyzers-common</artifactId>
|
||||
<version>4.4.0</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-highlighter -->
|
||||
<dependency>
|
||||
<groupId>org.apache.lucene</groupId>
|
||||
<artifactId>lucene-highlighter</artifactId>
|
||||
<version>4.4.0</version>
|
||||
</dependency>
|
||||
|
||||
<!--IK分词器 (智能中文分词器)-->
|
||||
<dependency>
|
||||
<groupId>com.janeluo</groupId>
|
||||
<artifactId>ikanalyzer</artifactId>
|
||||
<version>2012_u6</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</project>
|
@ -0,0 +1,43 @@
|
||||
package com.stdiet.custom.domain;
|
||||
|
||||
import com.stdiet.common.annotation.Excel;
|
||||
import com.stdiet.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 营养知识小问答对象 sys_nutrition_question
|
||||
*
|
||||
* @author xzj
|
||||
* @date 2021-04-13
|
||||
*/
|
||||
@Data
|
||||
public class SysNutritionQuestion extends BaseEntity
|
||||
{
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** $column.columnComment */
|
||||
private Long id;
|
||||
|
||||
/** 标题 */
|
||||
@Excel(name = "标题")
|
||||
private String title;
|
||||
|
||||
/** 内容 */
|
||||
@Excel(name = "内容")
|
||||
private String content;
|
||||
|
||||
/** 关键词,逗号隔开 */
|
||||
@Excel(name = "关键词,逗号隔开")
|
||||
private String key;
|
||||
|
||||
/** 标题内容索引分词之后的关键词 */
|
||||
@Excel(name = "标题内容索引分词之后的关键词")
|
||||
private String titleContentIndex;
|
||||
|
||||
/** 是否在小程序显示,0 不显示 1显示,默认0 */
|
||||
@Excel(name = "是否在小程序显示,0 不显示 1显示,默认0")
|
||||
private Integer showFlag;
|
||||
|
||||
/** 删除标识 0未删除 1已删除 */
|
||||
private Integer delFlag;
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package com.stdiet.custom.dto.response;
|
||||
|
||||
import com.stdiet.common.annotation.Excel;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
public class NutritionQuestionResponse implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** $column.columnComment */
|
||||
private Long id;
|
||||
|
||||
/** 标题 */
|
||||
@Excel(name = "标题")
|
||||
private String title;
|
||||
|
||||
/** 内容 */
|
||||
@Excel(name = "内容")
|
||||
private String content;
|
||||
|
||||
/** 关键词,逗号隔开 */
|
||||
@Excel(name = "关键词,逗号隔开")
|
||||
private String key;
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
package com.stdiet.custom.mapper;
|
||||
|
||||
import java.util.List;
|
||||
import com.stdiet.custom.domain.SysNutritionQuestion;
|
||||
|
||||
/**
|
||||
* 营养知识小问答Mapper接口
|
||||
*
|
||||
* @author xzj
|
||||
* @date 2021-04-13
|
||||
*/
|
||||
public interface SysNutritionQuestionMapper
|
||||
{
|
||||
/**
|
||||
* 查询营养知识小问答
|
||||
*
|
||||
* @param id 营养知识小问答ID
|
||||
* @return 营养知识小问答
|
||||
*/
|
||||
public SysNutritionQuestion selectSysNutritionQuestionById(Long id);
|
||||
|
||||
/**
|
||||
* 查询营养知识小问答列表
|
||||
*
|
||||
* @param sysNutritionQuestion 营养知识小问答
|
||||
* @return 营养知识小问答集合
|
||||
*/
|
||||
public List<SysNutritionQuestion> selectSysNutritionQuestionList(SysNutritionQuestion sysNutritionQuestion);
|
||||
|
||||
/**
|
||||
* 新增营养知识小问答
|
||||
*
|
||||
* @param sysNutritionQuestion 营养知识小问答
|
||||
* @return 结果
|
||||
*/
|
||||
public int insertSysNutritionQuestion(SysNutritionQuestion sysNutritionQuestion);
|
||||
|
||||
/**
|
||||
* 修改营养知识小问答
|
||||
*
|
||||
* @param sysNutritionQuestion 营养知识小问答
|
||||
* @return 结果
|
||||
*/
|
||||
public int updateSysNutritionQuestion(SysNutritionQuestion sysNutritionQuestion);
|
||||
|
||||
/**
|
||||
* 删除营养知识小问答
|
||||
*
|
||||
* @param id 营养知识小问答ID
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteSysNutritionQuestionById(Long id);
|
||||
|
||||
/**
|
||||
* 批量删除营养知识小问答
|
||||
*
|
||||
* @param ids 需要删除的数据ID
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteSysNutritionQuestionByIds(Long[] ids);
|
||||
|
||||
/**
|
||||
* 根据关键词搜索对应营养知识问答
|
||||
* @return
|
||||
*/
|
||||
public List<String> getNutritionQuestionListByKey(SysNutritionQuestion sysNutritionQuestion);
|
||||
}
|
@ -0,0 +1,70 @@
|
||||
package com.stdiet.custom.service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.stdiet.custom.domain.SysNutritionQuestion;
|
||||
|
||||
/**
|
||||
* 营养知识小问答Service接口
|
||||
*
|
||||
* @author xzj
|
||||
* @date 2021-04-13
|
||||
*/
|
||||
public interface ISysNutritionQuestionService
|
||||
{
|
||||
/**
|
||||
* 查询营养知识小问答
|
||||
*
|
||||
* @param id 营养知识小问答ID
|
||||
* @return 营养知识小问答
|
||||
*/
|
||||
public SysNutritionQuestion selectSysNutritionQuestionById(Long id);
|
||||
|
||||
/**
|
||||
* 查询营养知识小问答列表
|
||||
*
|
||||
* @param sysNutritionQuestion 营养知识小问答
|
||||
* @return 营养知识小问答集合
|
||||
*/
|
||||
public List<SysNutritionQuestion> selectSysNutritionQuestionList(SysNutritionQuestion sysNutritionQuestion);
|
||||
|
||||
/**
|
||||
* 新增营养知识小问答
|
||||
*
|
||||
* @param sysNutritionQuestion 营养知识小问答
|
||||
* @return 结果
|
||||
*/
|
||||
public int insertSysNutritionQuestion(SysNutritionQuestion sysNutritionQuestion);
|
||||
|
||||
/**
|
||||
* 修改营养知识小问答
|
||||
*
|
||||
* @param sysNutritionQuestion 营养知识小问答
|
||||
* @return 结果
|
||||
*/
|
||||
public int updateSysNutritionQuestion(SysNutritionQuestion sysNutritionQuestion);
|
||||
|
||||
/**
|
||||
* 批量删除营养知识小问答
|
||||
*
|
||||
* @param ids 需要删除的营养知识小问答ID
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteSysNutritionQuestionByIds(Long[] ids);
|
||||
|
||||
/**
|
||||
* 删除营养知识小问答信息
|
||||
*
|
||||
* @param id 营养知识小问答ID
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteSysNutritionQuestionById(Long id);
|
||||
|
||||
/**
|
||||
* 根据关键词搜索对应营养知识问答(Lucene索引分词查询)
|
||||
* @return
|
||||
*/
|
||||
public Map<String, Object> getNutritionQuestionListByKey(SysNutritionQuestion sysNutritionQuestion, int pageNum, int pageSize);
|
||||
|
||||
}
|
@ -0,0 +1,154 @@
|
||||
package com.stdiet.custom.service.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.stdiet.common.utils.DateUtils;
|
||||
import com.stdiet.common.utils.reflect.ReflectUtils;
|
||||
import com.stdiet.custom.utils.LuceneIndexUtils;
|
||||
import org.apache.lucene.document.Document;
|
||||
import org.apache.lucene.document.Field;
|
||||
import org.apache.lucene.document.TextField;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.stdiet.custom.mapper.SysNutritionQuestionMapper;
|
||||
import com.stdiet.custom.domain.SysNutritionQuestion;
|
||||
import com.stdiet.custom.service.ISysNutritionQuestionService;
|
||||
|
||||
/**
|
||||
* 营养知识小问答Service业务层处理
|
||||
*
|
||||
* @author xzj
|
||||
* @date 2021-04-13
|
||||
*/
|
||||
@Service
|
||||
public class SysNutritionQuestionServiceImpl implements ISysNutritionQuestionService
|
||||
{
|
||||
@Autowired
|
||||
private SysNutritionQuestionMapper sysNutritionQuestionMapper;
|
||||
|
||||
public static final String index_path = "D:\\develop\\LuceneIndex\\nutritionQuestion";
|
||||
//private static final String index_path = "";
|
||||
|
||||
//建立索引的字段名称
|
||||
public static final String[] index_field_array = {"id", "title", "content", "key"};
|
||||
|
||||
/**
|
||||
* 查询营养知识小问答
|
||||
*
|
||||
* @param id 营养知识小问答ID
|
||||
* @return 营养知识小问答
|
||||
*/
|
||||
@Override
|
||||
public SysNutritionQuestion selectSysNutritionQuestionById(Long id)
|
||||
{
|
||||
return sysNutritionQuestionMapper.selectSysNutritionQuestionById(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询营养知识小问答列表
|
||||
*
|
||||
* @param sysNutritionQuestion 营养知识小问答
|
||||
* @return 营养知识小问答
|
||||
*/
|
||||
@Override
|
||||
public List<SysNutritionQuestion> selectSysNutritionQuestionList(SysNutritionQuestion sysNutritionQuestion)
|
||||
{
|
||||
return sysNutritionQuestionMapper.selectSysNutritionQuestionList(sysNutritionQuestion);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增营养知识小问答
|
||||
*
|
||||
* @param sysNutritionQuestion 营养知识小问答
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public int insertSysNutritionQuestion(SysNutritionQuestion sysNutritionQuestion)
|
||||
{
|
||||
sysNutritionQuestion.setCreateTime(DateUtils.getNowDate());
|
||||
if(sysNutritionQuestionMapper.insertSysNutritionQuestion(sysNutritionQuestion) > 0){
|
||||
return createNutritionQuestionIndex(sysNutritionQuestion) ? 1 : 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改营养知识小问答
|
||||
*
|
||||
* @param sysNutritionQuestion 营养知识小问答
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public int updateSysNutritionQuestion(SysNutritionQuestion sysNutritionQuestion)
|
||||
{
|
||||
sysNutritionQuestion.setUpdateTime(DateUtils.getNowDate());
|
||||
return sysNutritionQuestionMapper.updateSysNutritionQuestion(sysNutritionQuestion);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除营养知识小问答
|
||||
*
|
||||
* @param ids 需要删除的营养知识小问答ID
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public int deleteSysNutritionQuestionByIds(Long[] ids)
|
||||
{
|
||||
return sysNutritionQuestionMapper.deleteSysNutritionQuestionByIds(ids);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除营养知识小问答信息
|
||||
*
|
||||
* @param id 营养知识小问答ID
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public int deleteSysNutritionQuestionById(Long id)
|
||||
{
|
||||
return sysNutritionQuestionMapper.deleteSysNutritionQuestionById(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据关键词搜索对应营养知识问答
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> getNutritionQuestionListByKey(SysNutritionQuestion sysNutritionQuestion, int pageNum, int pageSize){
|
||||
//return sysNutritionQuestionMapper.getNutritionQuestionListByKey(sysNutritionQuestion);
|
||||
try{
|
||||
//建立索引
|
||||
LuceneIndexUtils luceneIndexUtils = LuceneIndexUtils.getLuceneIndexUtils(index_path);
|
||||
return luceneIndexUtils.queryByKeyword(sysNutritionQuestion.getKey(), index_field_array, pageNum, pageSize);
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("total", 0);
|
||||
result.put("data", new ArrayList<>());
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 建立索引
|
||||
* @param sysNutritionQuestion
|
||||
* @return
|
||||
*/
|
||||
private boolean createNutritionQuestionIndex(SysNutritionQuestion sysNutritionQuestion){
|
||||
try{
|
||||
//建立索引
|
||||
LuceneIndexUtils luceneIndexUtils = LuceneIndexUtils.getLuceneIndexUtils(index_path);
|
||||
Document document = new Document();
|
||||
for (String fieldName : index_field_array) {
|
||||
document.add(new TextField(fieldName, ReflectUtils.getFieldValue(sysNutritionQuestion, fieldName)+"", Field.Store.YES));
|
||||
}
|
||||
return luceneIndexUtils.addIndexOne(document);
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,319 @@
|
||||
package com.stdiet.custom.utils;
|
||||
|
||||
import com.stdiet.common.utils.StringUtils;
|
||||
import com.stdiet.custom.service.impl.SysNutritionQuestionServiceImpl;
|
||||
import org.apache.lucene.document.Document;
|
||||
import org.apache.lucene.index.*;
|
||||
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
|
||||
import org.apache.lucene.search.*;
|
||||
import org.apache.lucene.store.Directory;
|
||||
import org.apache.lucene.store.FSDirectory;
|
||||
import org.apache.lucene.util.Version;
|
||||
import org.wltea.analyzer.core.IKSegmenter;
|
||||
import org.wltea.analyzer.core.Lexeme;
|
||||
import org.wltea.analyzer.lucene.IKAnalyzer;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.StringReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Lucene的IKAnalyzer工具类
|
||||
*/
|
||||
public class LuceneIndexUtils {
|
||||
|
||||
//分词器
|
||||
private IKAnalyzer analyzer = null;
|
||||
//索引库
|
||||
private Directory directory = null;
|
||||
//分词器工具
|
||||
private IndexWriterConfig config = null;
|
||||
//流
|
||||
private IndexWriter indexWriter= null;
|
||||
|
||||
public static final String default_primary_key = "id";
|
||||
|
||||
public static final Integer max_select_count = 1000;
|
||||
|
||||
public static LuceneIndexUtils getLuceneIndexUtils(String indexPath){
|
||||
LuceneIndexUtils luceneIndexUtils = new LuceneIndexUtils();
|
||||
try {
|
||||
//分词器
|
||||
luceneIndexUtils.analyzer = new IKAnalyzer();
|
||||
//使用智能分词
|
||||
luceneIndexUtils.analyzer.setUseSmart(true);
|
||||
//索引库
|
||||
luceneIndexUtils.directory = FSDirectory.open(new File(indexPath));
|
||||
//工具装配分词器
|
||||
luceneIndexUtils.config = new IndexWriterConfig(Version.LUCENE_44, luceneIndexUtils.analyzer);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return luceneIndexUtils;
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加所有数据
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
public int addIndexs(ArrayList<Document> documents) throws IOException {
|
||||
|
||||
//流 读取索引库 加装工具
|
||||
indexWriter = new IndexWriter(directory,config);
|
||||
|
||||
//数据进流
|
||||
indexWriter.addDocuments(documents);
|
||||
|
||||
try {
|
||||
indexWriter.commit();
|
||||
return documents.size();
|
||||
}catch (Exception e){
|
||||
indexWriter.rollback();
|
||||
return 0;
|
||||
}finally {
|
||||
indexWriter.close();
|
||||
indexWriter= null;
|
||||
//config=null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加一条数据
|
||||
* @param document
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
public boolean addIndexOne(Document document) throws IOException {
|
||||
|
||||
|
||||
//流 读取索引库 加装工具
|
||||
indexWriter = new IndexWriter(directory,config);
|
||||
|
||||
//数据进流
|
||||
indexWriter.addDocument(document);
|
||||
|
||||
try {
|
||||
indexWriter.commit();
|
||||
return true;
|
||||
}catch (Exception e){
|
||||
indexWriter.rollback();
|
||||
return false;
|
||||
}finally {
|
||||
indexWriter.close();
|
||||
indexWriter= null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除索引库所有数据
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
public boolean deleteAllIndex() throws IOException {
|
||||
|
||||
try {
|
||||
|
||||
//流 读取索引库 加装工具
|
||||
indexWriter = new IndexWriter(directory,config);
|
||||
|
||||
indexWriter.deleteAll();
|
||||
indexWriter.commit();
|
||||
return true;
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
indexWriter.rollback();
|
||||
return false;
|
||||
}finally {
|
||||
indexWriter.close();
|
||||
indexWriter= null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除索引库中一条数据
|
||||
* @param term
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
public boolean deleteOne(Term term) throws IOException {
|
||||
|
||||
|
||||
//流 读取索引库 加装工具
|
||||
indexWriter = new IndexWriter(directory,config);
|
||||
|
||||
try {
|
||||
indexWriter.deleteDocuments(term);
|
||||
indexWriter.commit();
|
||||
return true;
|
||||
}catch (Exception e){
|
||||
indexWriter.rollback();
|
||||
return false;
|
||||
}finally {
|
||||
indexWriter.close();
|
||||
indexWriter= null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改索引库中一条数据
|
||||
* 注意:此处修改为 根据查找条件修改 如果有则修改 没有则新添 多条则修改一条(索引库的底层其实做法是 先删除,后修改- -)
|
||||
* @param term
|
||||
* @param document
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
public boolean updateOne(Term term, Document document) throws IOException {
|
||||
|
||||
try {
|
||||
|
||||
//流 读取索引库 加装工具
|
||||
indexWriter = new IndexWriter(directory,config);
|
||||
|
||||
indexWriter.updateDocument(term,document);
|
||||
indexWriter.commit();
|
||||
return true;
|
||||
}catch (Exception e){
|
||||
indexWriter.rollback();
|
||||
return false;
|
||||
}finally {
|
||||
indexWriter.close();
|
||||
indexWriter= null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询索引库的数据(根据输入关键字)
|
||||
* @param keyword
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public Map<String, Object> queryByKeyword(String keyword, String[] columns, int pageNum, int pageSize) throws Exception {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
|
||||
//指定读取索引库的列数据
|
||||
//String[] columns = {"articleId","articleName","articleImage","articleContent"};
|
||||
|
||||
//装配
|
||||
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_44, columns, analyzer);
|
||||
|
||||
//解析输入关键字
|
||||
Query query = StringUtils.isEmpty(keyword) ? new WildcardQuery(new Term(default_primary_key, "*")) : queryParser.parse(keyword);
|
||||
|
||||
//读索引库流
|
||||
IndexReader reader = DirectoryReader.open(directory);
|
||||
|
||||
//获得读取对象
|
||||
IndexSearcher indexSearcher = new IndexSearcher(reader);
|
||||
|
||||
//排序
|
||||
SortField sortField = new SortField(default_primary_key, SortField.Type.INT, true);
|
||||
Sort sort = new Sort(sortField);
|
||||
|
||||
//装配解析结果 指定读取量级
|
||||
TopDocs search = indexSearcher.search(query, max_select_count, sort);
|
||||
|
||||
//获得数据地址数组
|
||||
ScoreDoc[] scoreDocs = search.scoreDocs;
|
||||
|
||||
result.put("total", scoreDocs.length);
|
||||
|
||||
//创建返回集合 --> 方便装配
|
||||
ArrayList<Document> list = new ArrayList<>();
|
||||
|
||||
int start = (pageNum - 1) * pageSize;
|
||||
|
||||
if(start < scoreDocs.length){
|
||||
int end = pageSize * pageNum;
|
||||
if (end > scoreDocs.length) {
|
||||
end = scoreDocs.length;
|
||||
}
|
||||
for (int i = start; i < end; i++) {
|
||||
//进集合 装配
|
||||
list.add(indexSearcher.doc(scoreDocs[i].doc));
|
||||
}
|
||||
}
|
||||
|
||||
result.put("data", list);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置索引库 不解释
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
public boolean resetIndexDB(ArrayList<Document> documents) throws IOException {
|
||||
|
||||
try {
|
||||
boolean bool = deleteAllIndex();
|
||||
System.out.println(bool);
|
||||
int i = addIndexs(documents);
|
||||
System.out.println(i);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 打印分词结果
|
||||
* @param keyWord
|
||||
* @throws Exception
|
||||
*/
|
||||
public static void printAnalysisResult(String keyWord) throws Exception {
|
||||
StringReader reader = new StringReader(keyWord);
|
||||
IKSegmenter ik = new IKSegmenter(reader, true);// 当为true时,分词器进行最大词长切分
|
||||
Lexeme lexeme = null;
|
||||
while ((lexeme = ik.next()) != null) {
|
||||
System.out.println(lexeme.getLexemeText());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
try{
|
||||
LuceneIndexUtils luceneIndexUtils = LuceneIndexUtils.getLuceneIndexUtils(SysNutritionQuestionServiceImpl.index_path);
|
||||
/*for (int i = 1 ; i < 100; i++){
|
||||
Document document = new Document();
|
||||
document.add(new TextField("id",i+"", Field.Store.YES));
|
||||
document.add(new TextField("title","什么食物是脂肪杀手?", Field.Store.YES));
|
||||
document.add(new TextField("content","黄瓜", Field.Store.YES));
|
||||
document.add(new TextField("key","脂肪|杀手|食物", Field.Store.YES));
|
||||
luceneIndexUtils.addIndexOne(document);
|
||||
|
||||
}*/
|
||||
/*Document document = new Document();
|
||||
document.add(new TextField("id","1", Field.Store.YES));
|
||||
document.add(new TextField("title","什么食物是脂肪杀手?", Field.Store.YES));
|
||||
document.add(new TextField("content","黄瓜", Field.Store.YES));
|
||||
document.add(new TextField("key","脂肪|杀手|食物", Field.Store.YES));
|
||||
luceneIndexUtils.addIndexOne(document);*/
|
||||
|
||||
String[] columns = {"key","content","title"};
|
||||
Map<String,Object> map = luceneIndexUtils.queryByKeyword("猝死", SysNutritionQuestionServiceImpl.index_field_array, 1,10);
|
||||
|
||||
System.out.println(Long.parseLong(map.get("total").toString()));
|
||||
|
||||
for(Document document : (List<Document>)map.get("data")){
|
||||
System.out.println(document.get("id")+"-"+document.get("key"));
|
||||
}
|
||||
|
||||
//LuceneIndexUtils.printAnalysisResult("什么食物是脂肪杀手?");
|
||||
}catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,114 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.stdiet.custom.mapper.SysNutritionQuestionMapper">
|
||||
|
||||
<resultMap type="SysNutritionQuestion" id="SysNutritionQuestionResult">
|
||||
<result property="id" column="id" />
|
||||
<result property="title" column="title" />
|
||||
<result property="content" column="content" />
|
||||
<result property="key" column="key" />
|
||||
<result property="titleContentIndex" column="title_content_index" />
|
||||
<result property="showFlag" column="show_flag" />
|
||||
<result property="createTime" column="create_time" />
|
||||
<result property="createBy" column="create_by" />
|
||||
<result property="updateTime" column="update_time" />
|
||||
<result property="updateBy" column="update_by" />
|
||||
<result property="delFlag" column="del_flag" />
|
||||
</resultMap>
|
||||
|
||||
<!-- 部分字段resultMap -->
|
||||
<resultMap type="com.stdiet.custom.dto.response.NutritionQuestionResponse" id="SysNutritionQuestionResultExtended">
|
||||
<result property="id" column="id" />
|
||||
<result property="title" column="title" />
|
||||
<result property="content" column="content" />
|
||||
<result property="key" column="key" />
|
||||
<result property="titleContentIndex" column="title_content_index" />
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectSysNutritionQuestionVo">
|
||||
select id, title, content, `key`, title_content_index, show_flag, create_time, create_by, update_time, update_by, del_flag from sys_nutrition_question
|
||||
</sql>
|
||||
|
||||
<select id="selectSysNutritionQuestionList" parameterType="SysNutritionQuestion" resultMap="SysNutritionQuestionResult">
|
||||
<include refid="selectSysNutritionQuestionVo"/> where del_flag = 0
|
||||
<if test="title != null and title != ''"> and title = #{title}</if>
|
||||
<if test="content != null and content != ''"> and content = #{content}</if>
|
||||
<if test="key != null and key != ''"> and `key` = #{key}</if>
|
||||
<if test="titleContentIndex != null and titleContentIndex != ''"> and title_content_index = #{titleContentIndex}</if>
|
||||
<if test="showFlag != null "> and show_flag = #{showFlag}</if>
|
||||
</select>
|
||||
|
||||
<select id="selectSysNutritionQuestionById" parameterType="Long" resultMap="SysNutritionQuestionResult">
|
||||
<include refid="selectSysNutritionQuestionVo"/>
|
||||
where id = #{id} and del_flag = 0
|
||||
</select>
|
||||
|
||||
<insert id="insertSysNutritionQuestion" parameterType="SysNutritionQuestion" useGeneratedKeys="true" keyProperty="id">
|
||||
insert into sys_nutrition_question
|
||||
<trim prefix="(" suffix=")" suffixOverrides=",">
|
||||
<if test="title != null">title,</if>
|
||||
<if test="content != null">content,</if>
|
||||
<if test="key != null and key != ''">`key`,</if>
|
||||
<if test="titleContentIndex != null">title_content_index,</if>
|
||||
<if test="showFlag != null">show_flag,</if>
|
||||
<if test="createTime != null">create_time,</if>
|
||||
<if test="createBy != null">create_by,</if>
|
||||
<if test="updateTime != null">update_time,</if>
|
||||
<if test="updateBy != null">update_by,</if>
|
||||
<if test="delFlag != null">del_flag,</if>
|
||||
</trim>
|
||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||
<if test="title != null">#{title},</if>
|
||||
<if test="content != null">#{content},</if>
|
||||
<if test="key != null and key != ''">#{key},</if>
|
||||
<if test="titleContentIndex != null">#{titleContentIndex},</if>
|
||||
<if test="showFlag != null">#{showFlag},</if>
|
||||
<if test="createTime != null">#{createTime},</if>
|
||||
<if test="createBy != null">#{createBy},</if>
|
||||
<if test="updateTime != null">#{updateTime},</if>
|
||||
<if test="updateBy != null">#{updateBy},</if>
|
||||
<if test="delFlag != null">#{delFlag},</if>
|
||||
</trim>
|
||||
</insert>
|
||||
|
||||
<update id="updateSysNutritionQuestion" parameterType="SysNutritionQuestion">
|
||||
update sys_nutrition_question
|
||||
<trim prefix="SET" suffixOverrides=",">
|
||||
<if test="title != null">title = #{title},</if>
|
||||
<if test="content != null">content = #{content},</if>
|
||||
<if test="key != null and key != ''">`key` = #{key},</if>
|
||||
<if test="titleContentIndex != null">title_content_index = #{titleContentIndex},</if>
|
||||
<if test="showFlag != null">show_flag = #{showFlag},</if>
|
||||
<if test="createTime != null">create_time = #{createTime},</if>
|
||||
<if test="createBy != null">create_by = #{createBy},</if>
|
||||
<if test="updateTime != null">update_time = #{updateTime},</if>
|
||||
<if test="updateBy != null">update_by = #{updateBy},</if>
|
||||
<if test="delFlag != null">del_flag = #{delFlag},</if>
|
||||
</trim>
|
||||
where id = #{id}
|
||||
</update>
|
||||
|
||||
<update id="deleteSysNutritionQuestionById" parameterType="Long">
|
||||
update sys_nutrition_question set del_flag = 1 where id = #{id}
|
||||
</update>
|
||||
|
||||
<update id="deleteSysNutritionQuestionByIds" parameterType="String">
|
||||
update sys_nutrition_question set del_flag = 1 where id in
|
||||
<foreach item="id" collection="array" open="(" separator="," close=")">
|
||||
#{id}
|
||||
</foreach>
|
||||
</update>
|
||||
|
||||
<!-- 根据关键词查询对应知识问题 -->
|
||||
<select id="getNutritionQuestionListByKey" parameterType="SysNutritionQuestion" resultMap="SysNutritionQuestionResultExtended">
|
||||
select id, title, `key`, content where del_flag = 0
|
||||
<if test="showFlag != null "> and show_flag = #{showFlag}</if>
|
||||
<if test="key != null and key != ''">
|
||||
and (title like CONCAT('%',#{key},'%') or key like CONCAT('%',#{key},'%') or titleContentIndex like CONCAT('%',#{key},'%'))
|
||||
</if>
|
||||
order by id desc
|
||||
</select>
|
||||
|
||||
</mapper>
|
Loading…
x
Reference in New Issue
Block a user