使用mongoDB做全文搜索
使用mongo做全文搜索使用它的 text 类型的索引实现的
需要先创建表
db.createCollection("search_data")
在这个表中设计三个字段
{
"_id": ObjectId("60e6a2c3ee1a3f20f6f21971"),
"eventid": NumberLong("610527999155245056"),
"event_content": "日常巡查时发现小区道路上有居民乱停放面包车。",
"search_text": "日常 巡查 时 发现 小区 道路 上 有 居民 乱 停放 面包车 。",
}
把event_content字段用中文分词器分词后存入search_text字段
数据里的空格,对于搜索来说很重要
创建索引
db.syzh_event.createIndex({search_text: "text"})
插入数据,然后使用索引搜索数据
db.syzh_event.find(
{$text: { $search: '红 草' }},
{score:{$meta:'textScore'}}
).sort(
{score:{ $meta: "textScore"}}
)
例子中的"红草" 会被分成两个字,然后进行搜索,
其中一个字命中就会得0.5分,两个字命中就是1.0分,如果字数多的话,按分词效果,类推
java 中文分词器
<dependency>
<groupId>org.ansj</groupId>
<artifactId>ansj_seg</artifactId>
<version>5.1.6</version>
</dependency>
String searchText = IndexAnalysis.parse(search).toStringWithOutNature(" ");
IndexAnalysis是针对索引分词的方法
其余方法,可以自行百度,或者去 github搜索其开源仓库,查看源码
java 实现搜索语法
mongo依赖是spring boot官方的
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
java代码:
实体类:
public class SearchEventPojo {
private String id;
private Long eventid;
private String event_content;
private String search_text;
private Double score;
// 自行 getter和setter
}
接口:
@Autowired
private MongoTemplate mongoTemplate;
@PostMapping("seacherData")
public Map seacherData(@RequestBody JSONObject req){
String search = req.getString("search");
// 写入数据时要分词,查询时也要分词后再查询
String searchText = IndexAnalysis.parse(search).toStringWithOutNature(" ");
TextQuery textQuery = new TextQuery(new TextCriteria().matching(searchText));
textQuery.includeScore(); // 这里获取数据后就会映射到score属性上了
textQuery.sortByScore();
List<SearchEventPojo> syzh_eventList = mongoTemplate.find(textQuery, SearchEventPojo.class, "syzh_event");
if (ListUtils.isNotBlank(syzh_eventList)) {
Map<String,Object> map = new LinkedHashMap<>();
map.put("count",syzh_eventList.size());
map.put("data",syzh_eventList);
return map;
}
@PostMapping("insertTestData")
public void insertTestData(@RequestBody JSONObject req){
SearchEventPojo searchEventPojo = JSONUtils.toBean(req, SearchEventPojo.class);
/* 开始分词 */
String text = IndexAnalysis.parse(searchEventPojo.getEvent_content()).toStringWithOutNature(" "); // 这里的空格很重要,全靠这空格实现mongo的中文分词搜索了,(夸张了一些)
searchEventPojo.setSearch_text(text);
searchEventPojo.setEventid(SFlakeUtils.getUUID()); // 自己随意赋值即可
mongoTemplate.insert(searchEventPojo, "syzh_event");
// 自行处理异常
}