广泛的过滤

时间:2016-11-24 16:43:13

标签: mongodb database

示例:

{
    shortName: "KITT",
    longName: "Knight Industries Two Thousand",
    fromZeroToSixty: 2,
    year: 1982,
    manufacturer: "Pontiac", 

    /* 25 more fields */ 

}
  • 能够通过至少20个字段进行查询,这意味着只有10个字段未编入索引
  • 可以用于排序(双向)的3个字段(所有数字)

这让我想知道具有大量可搜索字段的网站如何做到:例如房地产或汽车销售网站,您可以按照每个小细节进行过滤,并可以选择多种排序选项。< / p>

我怎么能用MongoDB来解决这个问题?我应该如何索引这种集合?

我知道有专门用于搜索的dbs,但每个数据库中必须有一般的经验法则(即使性能较低)。我相信不是每个人都使用Elasticsearch或类似的。

---

可选阅读:

我的理由是索引可能很大但索引顺序很重要。您始终要确保返回结果最少的字段是第一个,而大多数通用字段都是索引中的最后一个字段。但是,如果用户只选择通用字段呢?我是否应该包含非通用字段来进行查询?如何解决两种方式的订货?或索引交集节省了一天,我应该添加20个不同的索引?

1 个答案:

答案 0 :(得分:1)

text index是你的朋友。

在此处阅读:https://docs.mongodb.com/v3.2/core/index-text/

简而言之,这是告诉mongodb您想要在特定字段,多个字段或所有字段上进行全文搜索的方法(耶!)

要允许对所有字段进行文本索引,请使用特殊符号$**,并将其定义为“text”类型:

db.collection.createIndex( { "$**": "text" } )

您还可以使用Case InsensitivityDiacritic Insensitivity等配置它。

要使用索引执行文本搜索,请使用$text查询助手,请参阅:https://docs.mongodb.com/v3.2/reference/operator/query/text/#op._S_text

<强>更新

为了允许用户选择要搜索的特定字段,可以在创建文本索引时使用权重:https://docs.mongodb.com/v3.2/core/index-text/#specify-weights 如果您仔细选择字段的权重,例如仅使用不同的素数,然后将$meta文本分数添加到结果中,您可以从“textScore”中找出在此查询中匹配的字段,从而过滤掉未从所选搜索字段中获得匹配的结果。

在此处阅读更多内容:https://docs.mongodb.com/v3.2/tutorial/control-results-of-text-search/