刚学习数据库, 看文档有点半懂不懂的样, 伸手求一个实例以便能更好理解.
假设文档如下
{
"_id": : "xxxxx",
"title": "adidas 阿迪 T 恤 10010-20",
"catalog": "运动",
"brand": "阿迪达斯",
"price": 199,
"specs": [
{
"name": "材质",
"value": "涤纶"
},
{
"name": "上市",
"value": "2019 秋季"
}
]
}
如果我想要搜索 'T 恤', '运动', '阿迪达斯', '秋季', 这些词都能找到这条记录的话, 应该怎么创建索引?
1
fmumu 2019-11-06 21:24:33 +08:00 via Android
查记录和索引有啥关系?
|
2
aoscici2000 OP @fmumu 啥? 那我要像这样同时查找多个 key 内有没有某个词的话, 岂不是要一条挺长的查询语句? 我还以为能简化出来拼凑在一起呢...
|
3
yuikns 2019-11-07 08:05:31 +08:00 via Android
感觉你要的是 elasticsearch 吧
至少稍微学习下它的定位哦 |
4
JerryCha 2019-11-07 10:13:36 +08:00
我觉得你可能需要专门建立一个 tag 字段储存关键词。
MongoDB 有 text 索引可以支持模糊搜索,不过一个 collection 只能建一个。你这分散在各个字段的有点困难。 |
5
460881773 2019-11-07 10:37:54 +08:00
{
"_id" : ObjectId("5dc375c0acbff831b828a906"), "_class" : "plus.ojbk.web.controller.test", "title" : "adidas 阿迪 T 恤 10010-20", "catalog" : "运动", "brand" : "阿迪达斯", "price" : 199, "specs" : [ { "name" : "材质", "value" : "涤纶" }, { "name" : "上市", "value" : "2019 秋季" } ] } db.getCollection('test_a').find({ "$or" : [ { "title" : { "$regex" : "^.*秋季.*$" , "$options" : "i"}} , { "catalog" : { "$regex" : "^.*秋季.*$" , "$options" : "i"}} , { "brand" : { "$regex" : "^.*秋季.*$" , "$options" : "i"}} , { "specs" : { "$elemMatch" : { "value" : { "$regex" : "^.*秋季.*$" , "$options" : "i"}}}}]}) |
6
aoscici2000 OP @yuikns 差不多, 也去了解了下, 但感觉数据量很少, 没什么必要
|
7
460881773 2019-11-07 10:39:24 +08:00
```
String search ="秋季"; Query query = new Query(); Criteria criteria = new Criteria(); Pattern pattern = Pattern.compile("^.*" + search + ".*$", Pattern.CASE_INSENSITIVE); query.addCriteria( criteria.orOperator( Criteria.where("title").regex(pattern), Criteria.where("catalog").regex(pattern), Criteria.where("brand").regex(pattern) ,Criteria.where("specs").elemMatch(Criteria.where("value").regex(pattern)) ) ); System.err.println(query); List<test> a = mongoTemplate.find(query, test.class); System.err.println(a); ``` |
8
aoscici2000 OP @JerryCha 想过, 但感觉某些字段需要更新的话貌似也挺麻烦
|