mongodb 创建索引的实例

2019-11-06 21:05:57 +08:00
 aoscici2000

刚学习数据库, 看文档有点半懂不懂的样, 伸手求一个实例以便能更好理解.

假设文档如下

{
    "_id": : "xxxxx",
    "title": "adidas 阿迪 T 恤 10010-20",
    "catalog": "运动",
    "brand": "阿迪达斯",
    "price": 199,
    "specs": [
        {
            "name": "材质",
            "value": "涤纶"
        },
        {
            "name": "上市",
            "value": "2019 秋季"
        }
    ]
}

如果我想要搜索 'T 恤', '运动', '阿迪达斯', '秋季', 这些词都能找到这条记录的话, 应该怎么创建索引?

3929 次点击
所在节点    MongoDB
8 条回复
fmumu
2019-11-06 21:24:33 +08:00
查记录和索引有啥关系?
aoscici2000
2019-11-06 21:39:47 +08:00
@fmumu 啥? 那我要像这样同时查找多个 key 内有没有某个词的话, 岂不是要一条挺长的查询语句? 我还以为能简化出来拼凑在一起呢...
yuikns
2019-11-07 08:05:31 +08:00
感觉你要的是 elasticsearch 吧
至少稍微学习下它的定位哦
JerryCha
2019-11-07 10:13:36 +08:00
我觉得你可能需要专门建立一个 tag 字段储存关键词。
MongoDB 有 text 索引可以支持模糊搜索,不过一个 collection 只能建一个。你这分散在各个字段的有点困难。
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"}}}}]})
aoscici2000
2019-11-07 10:39:03 +08:00
@yuikns 差不多, 也去了解了下, 但感觉数据量很少, 没什么必要
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);

```
aoscici2000
2019-11-07 10:44:10 +08:00
@JerryCha 想过, 但感觉某些字段需要更新的话貌似也挺麻烦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/616991

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX