示例:
{
shortName: "KITT",
longName: "Knight Industries Two Thousand",
fromZeroToSixty: 2,
year: 1982,
manufacturer: "Pontiac",
/* 25 more fields */
}
这让我想知道具有大量可搜索字段的网站如何做到:例如房地产或汽车销售网站,您可以按照每个小细节进行过滤,并可以选择多种排序选项。< / p>
我怎么能用MongoDB来解决这个问题?我应该如何索引这种集合?
我知道有专门用于搜索的dbs,但每个数据库中必须有一般的经验法则(即使性能较低)。我相信不是每个人都使用Elasticsearch或类似的。
可选阅读:
我的理由是索引可能很大但索引顺序很重要。您始终要确保返回结果最少的字段是第一个,而大多数通用字段都是索引中的最后一个字段。但是,如果用户只选择通用字段呢?我是否应该包含非通用字段来进行查询?如何解决两种方式的订货?或索引交集节省了一天,我应该添加20个不同的索引?
答案 0 :(得分:1)
text index
是你的朋友。
在此处阅读:https://docs.mongodb.com/v3.2/core/index-text/
简而言之,这是告诉mongodb
您想要在特定字段,多个字段或所有字段上进行全文搜索的方法(耶!)
要允许对所有字段进行文本索引,请使用特殊符号$**
,并将其定义为“text”类型:
db.collection.createIndex( { "$**": "text" } )
您还可以使用Case Insensitivity
或Diacritic 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/